如何从SQL Server存储过程执行SSIS包并传递参数

时间:2019-05-07 19:21:43

标签: sql sql-server stored-procedures ssis

我正在尝试通过存储过程执行SSIS程序包。

仅当参数经过硬编码(如代码的第一版中所述)时,我才能成功执行该存储过程

第一版代码:

SELECT @Cmd = 'DTexec /F "C:\ssis\tool\package1.dtsx" 
                      /SET "\Package.Variables[User::ConfigurationName].Properties[Value]";"Report1" 
                      /SET "\Package.Variables[User::Country].Properties[Value]";"USA" 
                      /SET "\Package.Variables[User::OrgDepartment_Team].Properties[Value]";"USA" 
                      /SET "\Package.Variables[User::Subfix].Properties[Value]";"20190503" 
                      /SET "\Package.Variables[User::TeamName].Properties[Value]";"Team1"'

在数据库中创建一条记录

但是下面的代码不起作用(我传递了相同的参数值)

第二版代码:

SELECT @Cmd = 'DTexec /F "C:\ssis\tool\package1.dtsx" 
                      /SET "\Package.Variables[User::ConfigurationName].Properties[Value]";"' + @ConfigurationName + 
                   '" /SET "\Package.Variables[User::Country].Properties[Value]";"' + @Country + 
                   '" /SET "\Package.Variables[User::OrgDepartment_Team].Properties[Value]";"' + @OrgDepartment_Team +
                   '" /SET "\Package.Variables[User::Subfix].Properties[Value]";"' + @Subfix + 
                   '" /SET "\Package.Variables[User::TeamName].Properties[Value]";"' + @TeamName + '"'

没有错误,但是在数据库中也没有创建记录。

  

DTExec:程序包执行返回DTSER_SUCCESS(0)。

我将不胜感激:)

1 个答案:

答案 0 :(得分:1)

试图找出问题所在

您似乎正在使用有效的语法,但是我会提供一些建议,可能有助于解决该问题:

(1)NULL处理

检查命令中使用的变量均不包含NULL值,这可能导致串联的字符串值为NULL,您可以使用ISNULL()解决此问题。

SELECT @ConfigurationName = ISNULL(@ConfigurationName,'') , 
       @Country = ISNULL(@Country ,'') ,
       @OrgDepartment_Team = ISNULL(@OrgDepartment_Team,'') ,
       @Subfix  = ISNULL(@Subfix ,'') ,
       @TeamName = ISNULL(@TeamName,'')

(2)报价处理

我更希望引号包含在变量中而不是主字符串中。您可以使用QUOTENAME()函数来实现:

SELECT @ConfigurationName = QUOTENAME(ISNULL(@ConfigurationName,''),'"') , 
       @Country = QUOTENAME(ISNULL(@Country ,''),'"') ,
       @OrgDepartment_Team = QUOTENAME(ISNULL(@OrgDepartment_Team,''),'"') ,
       @Subfix  = QUOTENAME(ISNULL(@Subfix ,''),'"') ,
       @TeamName = QUOTENAME(ISNULL(@TeamName,''),'"')

SELECT @Cmd = 'DTexec /F "C:\ssis\tool\package1.dtsx" 
                      /SET "\Package.Variables[User::ConfigurationName].Properties[Value]";' + @ConfigurationName + 
                   ' /SET "\Package.Variables[User::Country].Properties[Value]";' + @Country + 
                   ' /SET "\Package.Variables[User::OrgDepartment_Team].Properties[Value]";' + @OrgDepartment_Team +
                   ' /SET "\Package.Variables[User::Subfix].Properties[Value]";' + @Subfix + 
                   ' /SET "\Package.Variables[User::TeamName].Properties[Value]";' + @TeamName 

(3)报告

您可以通过在命令中添加/Rep EWIP关键字来读取整个程序包日志:

SELECT @Cmd = 'DTexec /F "C:\ssis\tool\package1.dtsx" /Rep EWIP '
  

/ Rep [orting]级别[; event_guid_or_name [; event_guid_or_name [...]] :(可选)。指定要报告的消息类型。级别的可用报告选项如下:

     

N无报告。

     

E错误已报告。

     

W警告已报告。

     

I报告了信息性消息。

     

报告了C个自定义事件。

     

D数据流任务事件被报告。

     

已报告P进度。

     

V详细报告

参考