XP_CMDSHELL使用参数

时间:2016-09-23 16:51:04

标签: sql stored-procedures ssis xp-cmdshell

我正在尝试创建一个存储过程,允许我将参数传递给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执行包实用程序 版本12.0.2430.0适用于32位 版权所有(C)Microsoft Corporation。版权所有。 空值 开始时间:上午11:29:04 错误:2016-09-23 11:29:04.92    代码:0xC0016016    来源:包装    描述:无法解密受保护的XML节点" DTS:密码"错误0x8009000B"密钥无法在指定状态下使用。"。您可能无权访问此信息。出现加密错误时会发生此错误。验证  正确的密钥可用。 结束错误 错误:2016-09-23 11:29:04.92    代码:0xC0016016    来源:包装    描述:无法解密受保护的XML节点" DTS:密码"错误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。 AcquireConnection方法调用连接管理器" TEST.SpyderDB.TESTUSER"失败,错误代码为0xC0202009。 bef可能会发布错误消息 通过更多信息来了解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。执行方法成功,但引发的错误数(5)达到允许的最大值(1);导致失败。当错误数量达到指定数量时,会发生这种情况 d在MaximumErrorCount中。更改MaximumErrorCount或修复错误。 结束警告 警告:2016-09-23 11:29:05.03    代码:0x80019002    来源:包装    描述:SSIS警告代码DTS_W_MAXIMUMERRORCOUNTREACHED。执行方法成功,但引发的错误数(5)达到允许的最大值(1);导致失败。当错误数量达到指定数量时,会发生这种情况 d在MaximumErrorCount中。更改MaximumErrorCount或修复错误。 结束警告 DTExec:包执行返回DTSER_FAILURE(1)。 开始时间:上午11:29:04 完成时间:上午11:29:05 经过:0.172秒 NULL

1 个答案:

答案 0 :(得分:0)

如果您使用的是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