在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
但是我想在SSIS
包中使用上面的SQL任务,我无法正确地参数化数据库名称([DataSystem2014]
)或路径(F:\Folders\99_Temp\12_DataSystem\
)或文件名(DataSystem_20140915_181216.BAK
)。
数据库名称将相当稳定,但是希望将其作为参数引入SQL语句,路径可能会更改但也足够稳定,文件名始终会更改。我试过几个版本,用过?和参数映射,在SQL语句中使用@[User::Variable]
,但无法使它们正常工作,始终是错误消息。
这是我可以得到一些帮助的,请问该怎么做?
答案 0 :(得分:5)
发出SQL语句的任务称为Execute SQL Task
。根据您的Connection Manager类型,您将为占位符使用不同的字符。 Map Query Parameters
一般来说,人们在使用SQL Server时使用OLE DB连接管理器,因此替换字符为?
。这将是一个基于序数的替换令牌,所以即使你有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;
它可以像这个
那样大量参数化RESTORE DATABASE
?
FROM
DISK = ? WITH FILE = 1
, MOVE ? TO ?
, MOVE ? TO ?
, NOUNLOAD
, STATS = 5;
由于这些都是唯一值,我在SSIS中创建了许多变量来保存它们的值。实际上,我创建的变量比直接映射更多。
例如,我的已恢复数据库DataSystem2014名称可能始终与数据的虚拟名称和日志匹配,因此知道一个,我可以导出其他值。导出值的机制是表达式。因此,如果创建名为@[User::BaseDBName]
的变量,我可以通过设置@[User::DBLogName]
然后使用类似
EvaluateAsExpression = true
@[User::BaseDBName] + "_log"
您可以在链接的MSDN文章中看到如何将这些变量实际映射到查询中的占位符。
尽管如此,至少在我看来,当你有多个数据文件时,这一切都会崩溃。您现在正在考虑动态构建还原命令。
答案 1 :(得分:-1)
我假设你知道你在参数化的执行sql任务中做了什么,并且直接跳到我这样做的解决方案。
使用quotename('?')在sql中声明变量,然后构建动态sql以执行restore语句。
希望它有所帮助。