加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

批量附加SQL数据库工具-两款-需.net 4.0支持

(2011-06-07 22:55:17)
标签:

批量

附加

sq

l数据库

工具

4.0

支持

杂谈

分类: 计算机
http://s7/middle/4bea164eta5206e796936&6904.0支持" TITLE="批量附加SQL数据库工具-两款-需.net 4.0支持" />
下载:http://dl.dbank.com/c0qcdr56nb

http://s8/middle/4bea164eta5206e823bc7&6904.0支持" TITLE="批量附加SQL数据库工具-两款-需.net 4.0支持" />
下载:http://dl.dbank.com/c0jevcjlfx


============================================
批量附加数据库
问题提出:
      数据库迁移,采用公司老办法:数据库分离,复制到新服务器上,然后附加到新的数据库上。
遇到的问题是:需要附加的数据库有800多个。在sql2005里找不到批量附加的存储过程或者命令,一个一个附加也太麻烦了。


解决办法:

      1、在原数据库下用下面的asp页面生成批量脚本

      2、用ie访问并将生成的html文件内容复制到文本文档下

      3、替换掉旧的 mdf 、nlf和ldf文件路径,然后加载新的路径字符串

      4、在新数据库中运行脚本


asp代码部分:

<html>
<head></head>
<body>
<%
      set objConn = server.CreateObject("ADODB.Connection")
      sql = " P rovider=SQLOLEDB;data source=(local);initial catalog=master;user id=sa;password=Founder123;"
      objConn.open sql
      sqlstr="select db_name(dbid) name,filename from sysaltfiles"
      Set objrs = server.CreateObject("adodb.recordset")
      objrs.open sqlstr,objConn,3,3
      Dim db_name,i
      while not objrs.eof
              db_name = objrs("name")
              i = 1
              response.write("<br><br> EXEC sp_attach_db @dbname = '"&objrs("name")&"'<br>")
              response.write(",@filename"&i&" = '"&objrs("filename")&"' <br> ")
              objrs.movenext
              while Not objrs.eof And objrs("name") = db_name
                      i = i + 1
                      response.write(",@filename"&i&" = '"&objrs("filename")&"'<br>")
                      objrs.movenext
              Wend
      Wend
      objrs.close
      objConn.close
%>
</body>
</html>


生成的结果是:

EXEC sp_attach_db @dbname = 'master'
,@filename1 = 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\DATA\master.mdf'
,@filename2 = 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\DATA\mastlog.ldf'


EXEC sp_attach_db @dbname = 'tempdb'
,@filename1 = 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\DATA\tempdb.mdf'
,@filename2 = 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\DATA\templog.ldf'


EXEC sp_attach_db @dbname = 'model'
,@filename1 = 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\DATA\model.mdf'
,@filename2 = 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\DATA\modellog.ldf'


EXEC sp_attach_db @dbname = 'msdb'
,@filename1 = 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\DATA\MSDBData.mdf'
,@filename2 = 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\DATA\MSDBLog.ldf'


EXEC sp_attach_db @dbname = 'test_db'
,@filename1 = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\test_db_Data.mdf'
,@filename2 = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\test_db_Log.ldf'
,@filename3 = 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\DATA\test_db_data2.ndf'
,@filename4 = 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\DATA\test_db_data3.ndf'
,@filename5 = 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\DATA\test_db_log2.ldf'
……
……(省略无数条)
然后替换其路径即可。。

第一次用自己学到的东西解决实际问题,大家支持一下哈:),因为我昨天在网上找了老半天也没找到一个比较完整的解决方案,所以我今天用一个完整的代码给大家,希望能帮得上忙,这个方法适合数据库服务器中的所有数据库mdf和ldf文件都在data目录下,如果不是的话,那就要根据情况寻找解决方案了。


===================================传说中的分界线========================================


itpub上有个朋友提到,为什么非要用asp,直接写个sql脚本不就OK了么??后来想想也对,于是今天写了个脚本给大家:
declare @dbname varchar(20)
declare @filename nvarchar(520)
declare @temp_db_name varchar(20)
declare @i int
declare my_cursor cursor
for
  select  db_name(dbid) name,filename from master..sysaltfiles
  open my_cursor
  fetch next from my_cursor into @dbname,@filename
  while  @@fetch_status = 0
  begin
     set @temp_db_name = @dbname
  set @i = 1
  print 'exec sp_attach_db @ db_name = ‘ + @ dbname +' ,@ filename'+ convert(varchar,@ i) +'  = ‘’' + @ filename+‘’‘’
  fetch next from my_cursor into @dbname,@filename
  while @@fetch_status = 0 and @temp_db_name = @dbname
  begin
       set @i = @i + 1
        print ',@filename' + convert(varchar,@i) + ' = ‘’'+ @filename+‘’‘’
       fetch next from my_cursor into @dbname,@filename
  end
            print ‘’
  end
close my_cursor
deallocate my_cursor

结果和上面的差不多……


===================================传说中的分界线========================================

下面是我写的一个存储过程,输入的参数是mdf等文件的存放路径。

if object_id('attach_db_pro') is not null
drop procedure attach_db_pro
go


create procedure attach_db_pro
@dir nvarchar(520)
as
declare @dbname varchar(20)
declare @filename nvarchar(520)
declare @name sysname
declare @temp_db_name varchar(20)
declare @i int
declare my_cursor cursor
for
    select  db_name(dbid) dbname,name,filename from master..sysaltfiles
    open my_cursor
    fetch next from my_cursor into @dbname,@name,@filename
    while  @@fetch_status = 0
    begin
          set @temp_db_name = @dbname
          set @i = 1
          print 'exec sp_attach_db @db_name = ' + @ dbname + ',@ filename' + convert(varchar,@ i) + ' = ‘’' + @ dir + '\' + @ name + right(@ filename,4)+‘’‘’
          fetch next from my_cursor into @dbname,@name,@filename
          while @@fetch_status = 0 and @temp_db_name = @dbname
          begin
                  set @i = @i + 1
                  print ',@ filename' + convert(varchar,@i) + ' = ‘’’ + @ dir + '\'+@ name+right(@ filename,4)+‘‘’’
                  fetch next from my_cursor into @dbname,@name,@filename
          end
          print ''
    end
close my_cursor
deallocate my_cursor
go

使用例子:
exec attach_db_pro 'c:\program files\Microsoft SQL Server\Data'

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有