使用T-SQL附加多个数据库

Nei*_*off 3 sql sql-server-2008

我们正在将我们的一台服务器从SQL Server 2005迁移到SQL Server 2008.该服务器上有大约50个小型数据库.

我们采取的迁移路径如下:

  1. 使用SQL 2008创建新服务器
  2. 关闭旧服务器上的SQL服务并将数据库复制到新服务器
  3. 关闭旧服务器并将新服务器重命名为与旧服务器相同的名称.
  4. 附上50个数据库

有没有一种使用t-sql将50个数据库附加到新服务器的快速方法?

所有数据文件都将位于E:\ DATA,事务日志将位于E:\ TLOG

mar*_*c_s 5

使用SQLCMD模式,您可以轻松编写此脚本:

:setvar dbname YourDatabaseName
:setvar dbfile N'E:\DATA\YourDatabase.mdf'
:setvar logfile N'E:\TLOG\YourDatabase_log.ldf'
USE [master]
GO

CREATE DATABASE $(dbname) ON 
( FILENAME = $(dbfile) ),
( FILENAME = $(logfile) )
FOR ATTACH
GO
Run Code Online (Sandbox Code Playgroud)

这可以来自sqlcmd.exe命令行(您甚至可以从命令行提供变量的值dbname, dbfile, logfile),或者如果您启用它,它也适用于SQL Server Management Studio Tools > Options > Query Execution > by default, open new queries in SQLCMD mode.

阅读有关SQLCMD实用程序及其在MSDN上的所有参数的更多信息.

PS:当然,这种使用SQLCMD启用脚本的方法也适用于BACKUP/RESTORE循环:-)(按照Aaron的建议)

PPS:如果你有一个好的命名约定,并且数据文件总是$(dbname).mdf和日志文件总是$(dbname)_log.ldf,你也可以使用这个缩短的SQLCMD脚本:

:setvar dbname YourDatabaseName
USE [master]
GO

CREATE DATABASE $(dbname) ON 
( FILENAME = N'E:\DATA\$(dbfile).mdf' ),
( FILENAME = N'E:\TLOG\$(logfile)_log.ldf' )
FOR ATTACH
GO
Run Code Online (Sandbox Code Playgroud)

然后从命令行调用它:

C:\>  sqlcmd.exe -S yourserver -E -i attach.sql -v dbname=YourDb1
Run Code Online (Sandbox Code Playgroud)

等等,每个数据库需要重新附加一次.

PPPS:如果你想恢复备份,它只是稍微复杂一点:

:setvar dbname YourDatabaseName
USE [master]
GO

RESTORE DATABASE $(dbname)
FROM DISK = N'E:\Backup\$(dbname).bak' 
WITH FILE = 1,  
MOVE N'$(dbname)' TO N'E:\DATA\$(dbname).mdf',  
MOVE N'$(dbname)_Log' TO N'E:\TLOG\$(dbname)_Log.ldf',  
NOUNLOAD, REPLACE
GO
Run Code Online (Sandbox Code Playgroud)

只要您将.bak文件命名为与数据库名称相同,并将它们放在固定位置(我假设E:\Backup在这里 - 根据需要进行调整),这样就可以了.