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

时间:2014-10-03 14:43:44

标签: sql-server database 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

但是我想在SSIS包中使用上面的SQL任务,我无法正确地参数化数据库名称([DataSystem2014])或路径(F:\Folders\99_Temp\12_DataSystem\ )或文件名(DataSystem_20140915_181216.BAK)。

数据库名称将相当稳定,但是希望将其作为参数引入SQL语句,路径可能会更改但也足够稳定,文件名始终会更改。我试过几个版本,用过?和参数映射,在SQL语句中使用@[User::Variable],但无法使它们正常工作,始终是错误消息。

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

2 个答案:

答案 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语句。

希望它有所帮助。