【问题标题】:XP_CMDSHELL To run a SSIS Package w/ ParametersXP_CMDSHELL 运行带参数的 SSIS 包
【发布时间】:2016-09-23 16:51:03
【问题描述】:

我正在尝试创建一个允许我将参数传递给 SSIS 包的存储过程。

DECLARE @Path VARCHAR(200),
@ExcelPath VARCHAR(50),
@DB VARCHAR(100), 
@ExcelSheet VARCHAR(500),
@Cmd VARCHAR(4000),
@ReturnCode INT,
@Msg VARCHAR(1000),
@SQLServer varchar(255),
@EmailAddress varchar(255),
@DTEXEC varchar(255)


SELECT @Path = 'C:\SpyderNetwork Production\SSIS\IMPORTSC\'
SELECT @ExcelPath = 'C:\Users\Administrator\Desktop\SR\test.xlsx' 
SELECT @ExcelSheet = 'DATA$'
select @DTEXEC = 'C:\"Program Files (x86)"\"Microsoft SQL Server"\120\DTS\Binn\dtexec.exe'



exec xp_cmdshell ''

SELECT @Cmd = @DTEXEC + ' /FILE "' + @Path + 'package.dtsx" /MAXCONCURRENT 1 /CHECKPOINTING OFF /REPORTING EW'
+ ' /SET \Package.Variables[User::ExcelPath].Properties[Value];' + @ExcelPath 
+ ' /SET \Package.Variables[User::ExcelSheet].Properties[Value];' + @ExcelSheet


EXEC @ReturnCode = xp_cmdshell @Cmd

我已经用它们的值替换了参数,在命令提示符下运行并且一切正常,但是当我在这里实现它时,我收到以下错误。同样,当我可以在命令提示符下运行并且它没有问题时,它说我没有运行它的权限是没有意义的。我在这里缺少一些基本的东西吗?

Microsoft (R) SQL Server 执行包实用程序 32 位版本 12.0.2430.0 版权所有 (C) 微软公司。版权所有。 空值 开始时间:上午 11:29:04 错误:2016-09-23 11:29:04.92 代码:0xC0016016 来源:包 说明:无法解密受保护的 XML 节点“DTS:Password”,错误为 0x8009000B“密钥在指定状态下无效。”。您可能无权访问此信息。当存在加密错误时会发生此错误。验证 正确的密钥可用。 结束错误 错误:2016-09-23 11:29:04.92 代码:0xC0016016 来源:包 说明:无法解密受保护的 XML 节点“DTS:Password”,错误为 0x8009000B“密钥在指定状态下无效。”。您可能无权访问此信息。当存在加密错误时会发生此错误。验证 正确的密钥可用。 结束错误 错误:2016-09-23 11:29:05.03 代码:0xC0202009 来源:包连接管理器“TEST.SpyderDB.TESTUSER” 说明:SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误代码:0x80040E4D。 OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 11.0”Hresult:0x80040E4D 描述:“用户 'TESTUSER' 登录失败。”。 结束错误 错误:2016-09-23 11:29:05.03 代码:0xC020801C 来源:数据流任务 OLE DB 目标 [69] 说明:SSIS 错误代码 DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER。对连接管理器“TEST.SpyderDB.TESTUSER”的 AcquireConnection 方法调用失败,错误代码为 0xC0202009。之前可能会发布错误消息 或有关 AcquireConnection 方法调用失败原因的更多信息。 结束错误 错误:2016-09-23 11:29:05.03 代码:0xC0047017 来源:数据流任务 SSIS.Pipeline 说明:OLE DB 目标验证失败并返回错误代码 0xC020801C。 结束错误 错误:2016-09-23 11:29:05.03 代码:0xC004700C 来源:数据流任务 SSIS.Pipeline 说明:一个或多个组件验证失败。 结束错误 错误:2016-09-23 11:29:05.03 代码:0xC0024107 来源:数据流任务 描述:任务验证期间出现错误。 结束错误 警告:2016-09-23 11:29:05.03 代码:0x80019002 资料来源:importSCSoldUnits 说明:SSIS 警告代码 DTS_W_MAXIMUMERRORCOUNTREACHED。 Execution 方法成功,但引发的错误数 (5) 达到了允许的最大值 (1);导致失败。当错误数量达到指定的数量时会发生这种情况 d 在最大错误计数中。更改 MaximumErrorCount 或修复错误。 结束警告 警告:2016-09-23 11:29:05.03 代码:0x80019002 来源:包 说明:SSIS 警告代码 DTS_W_MAXIMUMERRORCOUNTREACHED。 Execution 方法成功,但引发的错误数 (5) 达到了允许的最大值 (1);导致失败。当错误数量达到指定的数量时会发生这种情况 d 在最大错误计数中。更改 MaximumErrorCount 或修复错误。 结束警告 DTExec:包执行返回 DTSER_FAILURE (1)。 开始时间:上午 11:29:04 完成时间:上午 11:29:05 经过:0.172 秒 空

【问题讨论】:

  • 是的,这就是解决方案。将 SSIS 包保护级别属性创建为 EncryptSensitiveWithPassword 和项目保护级别相同。在 SQL 中添加 /De 密码(与保护级别中使用的密码相同)以执行 SSIS。现在一切正常。

标签: sql stored-procedures ssis xp-cmdshell


【解决方案1】:

如果您使用的是 SQL 2012 或更高版本,则可以使用其他解决方案而不使用 xp_cmdshell。

项目应在项目部署模型中并部署到 SSISDB 目录。

EXEC [SSISDB].[catalog].[create_execution] 
        @folder_name = N'Folder',
        @project_name = N'Test',
        @package_name = N'Package.dtsx',
        @reference_id = NULL,
        @use32bitruntime = FALSE,     
        @execution_id = @executionID OUTPUT

    EXEC [SSISDB].[catalog].[set_execution_parameter_value] 
    @executionID,
    @object_type = 20, 
    @parameter_name = N'Var1', 
    @parameter_value = @Var1

    EXEC [SSISDB].[catalog].[set_execution_parameter_value] 
    @executionID,
    @object_type = 20, 
    @parameter_name = N'Var2', 
    @parameter_value = @Var2

    EXEC [SSISDB].[catalog].[start_execution] @executionID

【讨论】:

  • 谢谢,我一定要试一试。这比我尝试的要干净得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多