看到标题,估计有同行笑了,这年代还有用sql2000的?真的有,最近单位服务器数据迁移升级,将数据库迁移到新服务器后,发现数据全是2000的,无法直接导入到sql2012。
没办法,只能先将数据库文件先导到安装有sql2008的电脑上(2000无法直接升级到2012,需要通过2005或者2008中转下)。
但是面对上百个数据库直接晕倒,一个个附加,升级完后再一个个分离绝对不是个好活。
于是就有了下边的代码
/*****
附加指定文件夹的数据库
然后执行分离(为了升级数据库,只是为了附加的话,无需再分离)
*******/
---需要开启xp_cmdshell 如已经开启 可以略过
/***** Step 1 开启 xp_cmdshell
Use Master
GO
EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
GO
*******/
if object_id('tempdb..#files') is null
Begin
CREATE TABLE #files (name varchar(200) NULL, sql varchar(7000) NULL)
End
DELETE #files
declare @path varchar(500)
declare @sql varchar(8000)
set @path='D:\旧题库数据库\DBFile' ---指定要处理的文件夹
set @sql='dir '+@path+' /b'
--获取文件名称,存放在#files
INSERT #files(name)
exec master..xp_cmdshell @sql
--删除不要的文件名称
DELETE #files WHERE coalesce(name, '') NOT LIKE '%.mdf'
UPDATE #files set name=REPLACE(name,'.mdf','')
UPDATE #files
SET sql = 'sp_attach_db @dbname = '''+name+''''+
',@filename1 = '''+@path+'\'+name+'.mdf''' +
',@filename2 = '''+@path+'\'+name+'.ldf'''
select * from #files
--执行附加
DECLARE cur CURSOR STATIC LOCAL FOR
SELECT sql FROM #files
OPEN cur
WHILE 1 = 1
BEGIN
FETCH cur INTO @sql
IF @@fetch_status <> 0
BREAK
exec(@sql)
END
DEALLOCATE cur
-----分离数据库
declare @name varchar(500)
DECLARE cur CURSOR STATIC LOCAL FOR
SELECT name FROM #files
OPEN cur
WHILE 1 = 1
BEGIN
FETCH cur INTO @name
IF @@fetch_status <> 0
BREAK
exec('sp_detach_db ' + @name)
END
DEALLOCATE cur
--DROP TABLE #files