2016-08-08 28 views
1

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 
+0

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

+0

Derzeit kann ich das Paket nicht ändern, aber wenn ich SSDT zur Integration mit unserer Software-Richtlinie bekomme, werde ich das tun. – Elsimer

Antwort

1

Sie diese Variable mit einem ersetzen soll Parameter, so dass es von außen einfach einstellbar ist und den Paketentwicklern klar ist, dass es auf diese Weise erwartet wird.

Als vorübergehende Lösung sollten Sie jedoch feststellen, dass etwas wie das Folgende funktioniert.