不确定如何以编程方式将我的SSISDB软件包连接到环境参考

时间:2019-06-17 19:34:13

标签: ssis

我正在使用项目部署。我有几个项目参数。我的软件包仅使用项目级参数,而不使用软件包级参数。我已经以编程方式部署了我的项目并设置了环境参考:

SSISDB config

我从SQL Agent作业调用每个程序包。运行包时,我无法将环境变量链接到该包。我已成功将项目链接到环境:

Project param config

project env ref

但是现在当我运行代理作业时,它会失败。当我查看SSISDB报告时,它说“创建了执行”,但没有显示任何变量。

实际上我是否必须显式地将每个包中的每个变量都链接到环境变量?为什么还要麻烦按环境分组?

我已经创建了这样的环境参考(sql cmd):

EXEC [SSISDB].[catalog].[create_environment_reference] @environment_name='$(ChooseEnvironment)', @reference_id=@reference_id OUTPUT, @project_name='$(ProjectName)', @folder_name='$(folderName)', @reference_type=R
EXEC SSISDB.catalog.set_object_parameter_value @parameter_name=N'EmailFrom', @parameter_value='EmailFrom', @project_name=$(ProjectName), @object_type=20, @folder_name=$(FolderName), @value_type=N'R'

其他信息:我创建了一个sql代理作业,该作业使用以下作业步骤调用每个软件包:

set @cmd = N'/ISSERVER "\"\SSISDB\CHAT\SSISPackages\Chat_Load_RMS_InputFiles.dtsx\"" /SERVER "\"' + @TargetDBServer + '\"" /Par "\"$ServerOption::LOGGING_LEVEL(Int16)\"";1 /Par "\"$ServerOption::SYNCHRONIZED(Boolean)\"";True /CALLERINFO SQLAGENT /REPORTING E'

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, 
@step_name=N'PACKAGE: Chat_Load_RMS_InputFiles.dtsx', 
        @step_id=1, 
        @cmdexec_success_code=0, 
        @on_success_action=3, 
        @on_success_step_id=0, 
        @on_fail_action=2, 
        @on_fail_step_id=0, 
        @retry_attempts=0, 
        @retry_interval=0, 
        @os_run_priority=0, @subsystem=N'SSIS', 
        @command=@cmd,
        @database_name=N'master', 
        @flags=0

是否需要向SSIS @cmd变量添加引用ID?另外,如果我在工作中解决此问题,是否可以删除上面的代码以将每个项目级变量设置为环境,还是仍然需要?为了保持清洁,我应该只能说:这个项目使用这种环境。做完了否则,这几乎就像使用程序包级别的变量以及那些需要的修补程序。


1 个答案:

答案 0 :(得分:1)

如果在SQL Agent步骤中将软件包作为“直接” SSIS步骤运行,则必须在步骤配置对话框的“软件包配置”选项卡中选择环境。

如果使用TSQL脚本运行它,则在调用catalog.create_execution时需要提供参考ID:

    DECLARE
        @reference_id bigint,
        @FullPackageName NVARCHAR(100);

    SELECT @reference_id = reference_id
        FROM  [$(SSISDB)].catalog.environment_references er
            INNER JOIN [$(SSISDB)].catalog.projects AS p 
                ON p.project_id = er.project_id
            INNER JOIN [$(SSISDB)].catalog.folders AS f
                ON f.folder_id = p.folder_id
    WHERE  er.environment_folder_name IS NULL
        AND er.environment_name = @EnvironmentName
        AND p.name              = @ProjectName
        AND f.name              = @FolderName;

    IF @@ROWCOUNT = 0
    BEGIN
        DECLARE
            @msg NVARCHAR(100);

        SET @msg = N'Could not find a reference for a local (.) ''' + @EnvironmentName + N''' environment.';
        THROW 50000, @msg, 1;
    END;

    SET @FullPackageName = @PackageName + N'.dtsx';

    EXEC [$(SSISDB)].catalog.create_execution
        @package_name = @FullPackageName,
        @execution_id = @execution_id OUTPUT,
        @folder_name = @FolderName,
        @project_name = @ProjectName,
        @use32bitruntime = False,
        @reference_id = @reference_id;