Ich erbte kürzlich eine Datenbank mit einer gespeicherten Prozedur, die ein SSIS-Paket mit xp_cmdshell ausführt, während dem Paket eine einzelne Benutzervariable hinzugefügt wird (Code unten). Im Rahmen unserer Migration zu SQL Server 2016 (von SQL Server 2008 R2) versuche ich, diese gespeicherte Prozedur so zu ändern, dass sie das Paket stattdessen aus einem Integration Services-Katalog namens SSISDB aufruft. Das Problem, auf das ich stoße, ist, dass ich nicht herausfinden kann, wie ich diese Variable so an das Paket weitergeben kann, dass sie es erkennt!Wie führe ich ein SSIS-Paket aus dem Integration Services-Katalog aus, während ich eine Variable in T/SQL festlege?
Alter Code:
DECLARE @Report_id INT = 63936
,@result INT
,@dtsExecCmd VARCHAR(4000)
,@params INT
,@path VARCHAR(500);
DECLARE @sif_report_object_ref_id VARCHAR(32)
,@error_count INT;
SET @result = 0;
SET @path = 'E:\OldServerFiles\Deployment\Package.dtsx';
SET @params = @Report_id;
SET @dtsExecCmd = 'dtexec /F ' + @path;
SET @dtsExecCmd = @dtsExecCmd
+ ' /SET "\package.Variables[User::Report_Id].Properties[Value]";"\"'
+ CAST(@params AS VARCHAR(10)) + '\""';
EXEC @result = [sys].[xp_cmdshell] @dtsExecCmd, [no_output];
PRINT @result;
Hier ist, was ich bisher habe, und es führt aber mit dem Standardwert für die REPORT_ID Parameter:
DECLARE @execution_id BIGINT
EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Package.dtsx', @[email protected]_id OUTPUT, @folder_name=N'TestProject', @project_name=N'TestReportETLPackage', @use32bitruntime=False, @reference_id=NULL
SELECT @execution_id
DECLARE @var0 SMALLINT = 3
DECLARE @ReportId INT = 63936
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, @object_type=50, @parameter_name=N'LOGGING_LEVEL', @[email protected]
-- something goes in here for User::Report_Id as a package variable...
EXEC [SSISDB].[catalog].[start_execution] @execution_id
GO
Können Sie das Paket ändern, um von der Verwendung einer SSIS-Variable zu einem SSIS-Parameter zu wechseln? Dies ist der einfachste und klarste Weg, um Werte von einem aufrufenden Prozess zu übergeben. – onupdatecascade
Derzeit kann ich das Paket nicht ändern, aber wenn ich SSDT zur Integration mit unserer Software-Richtlinie bekomme, werde ich das tun. – Elsimer