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

标签 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

最佳答案

使用 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

这可以从命令行的 sqlcmd.exe 工作(您甚至可以从命令行提供变量 dbname, dbfile, logfile 的值) ,或者如果您启用 Tools > Options > Query Execution > 默认情况下,它可以在 SQL Server Management Studio 中工作,在 SQLCMD 模式下打开新查询

阅读有关 SQLCMD utility and all its parameters 的更多信息在 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

然后从命令行调用它:

C:\>  sqlcmd.exe -S yourserver -E -i attach.sql -v dbname=YourDb1

以此类推,每个数据库都需要重新附加一次。

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

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

关于sql - 使用 T-SQL 附加多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10835153/

相关文章:

sql - 具有多列输入的 SQL 函数中的嵌套 Case 表达式

mysql - sql SELECT查询不做相反的事情

SQL Server 2008 - 从字符串开头去除数字

sql - SQL 2008 存储过程中可选的 where 子句/参数?

sql - 存取sys.dm_db_index_usage_stats的权限

sql - 按 DISTINCT 列限制/偏移

sql - 使用 SELECT 中的参数执行存储过程

sql - 自动生成一个 uuid 并使用它的一部分来更新单个 postgres 查询语句中的另一列

sql - 如何从SQL Server 2008地理线获取纬度经度?

sql - 在 SQL Server 中使用动态列查看