在Ms-SQL Server中通过脚本恢复数据库如下所示我想在SSIS包中参数化数据库名称,路径和文件名

0 database sql-server ssis

在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语句中使用,但无法使它们工作,始终是错误消息.

这是我可以得到一些帮助的东西,请问怎么做?

bil*_*nkc 5

发出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文章中看到如何将这些变量实际映射到查询中的占位符.

尽管如此,至少在我看来,当你有多个数据文件时,这一切都会崩溃.您现在正在考虑动态构建还原命令.