在Ms-SQL Server中恢复数据库我有一个如下脚本,但想在包中参数化数据库名称,路径和文件名,SSIS我该怎么做?
细节:
该脚本有效,我通过右键单击Ms SQL server中的Restore来获取此脚本:
USE [master]
RESTORE DATABASE [DataSystem2014] FROM DISK = N'F:\Folders\99_Temp\12_DataSystem\DataSystem_20140915_181216.BAK' WITH FILE = 1, MOVE N'DataSystem2014' TO N'F:\DatabaseFiles\DataSystem2014_Primary.mdf', MOVE N'DataSystem2014_log' TO N'F:\DatabaseLogFiles\DataSystem2014_Primary.ldf', NOUNLOAD, STATS = 5
GO
Run Code Online (Sandbox Code Playgroud)
但是我想在SSIS包中使用上面的SQL任务,我无法正确地参数化数据库名称([DataSystem2014])或路径(F:\Folders\99_Temp\12_DataSystem\)或文件名(DataSystem_20140915_181216.BAK).
数据库名称将相当稳定,但是希望将其作为参数引入SQL语句,路径可能会更改但也足够稳定,文件名始终会更改.我试过几个版本,用过?和参数映射,@[User::Variable]在SQL语句中使用,但无法使它们工作,始终是错误消息.
这是我可以得到一些帮助的东西,请问怎么做?
发出SQL语句的任务称为Execute SQL Task.根据您的Connection Manager类型,您将为占位符使用不同的字符. 映射查询参数
一般来说,人们在使用SQL Server时使用OLE DB连接管理器,因此替换字符是a ?.这将是一个基于序数的替换令牌,所以即使你有N次相同的字符串,你将不得不添加N ?并进行N个变量映射.
看看你的查询,
RESTORE DATABASE
[DataSystem2014]
FROM DISK = N'F:\Folders\99_Temp\12_DataSystem\DataSystem_20140915_181216.BAK' WITH FILE = 1
, MOVE N'DataSystem2014' TO N'F:\DatabaseFiles\DataSystem2014_Primary.mdf'
, MOVE N'DataSystem2014_log' TO N'F:\DatabaseLogFiles\DataSystem2014_Primary.ldf'
, NOUNLOAD
, STATS = 5;
Run Code Online (Sandbox Code Playgroud)
它可以像这样大量参数化
RESTORE DATABASE
?
FROM
DISK = ? WITH FILE = 1
, MOVE ? TO ?
, MOVE ? TO ?
, NOUNLOAD
, STATS = 5;
Run Code Online (Sandbox Code Playgroud)
由于这些都是唯一值,我会在SSIS中创建一些变量来保存它们的值.实际上,我创建的变量多于我直接映射的变量.
例如,我的已恢复数据库DataSystem2014名称可能始终与数据的虚拟名称和日志匹配,因此知道一个,我可以导出其他值.导出值的机制是表达式.因此,如果创建一个名为的变量@[User::BaseDBName],我可以@[User::DBLogName]通过设置EvaluateAsExpression = true然后使用类似的公式来创建
@[User::BaseDBName] + "_log"
Run Code Online (Sandbox Code Playgroud)
您可以在链接的MSDN文章中看到如何将这些变量实际映射到查询中的占位符.
尽管如此,至少在我看来,当你有多个数据文件时,这一切都会崩溃.您现在正在考虑动态构建还原命令.