? ? ? ?看到標題,估計有同行笑了,這年代還有用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