我是SSIS / SQL的新手,所以以下命名参考可能不正确,但我希望传达问题的要点
我正在使用的调度工具在SQL 2012中执行部署的SSIS包,此工具需要指示SSIS包失败的时间,然后停止运行任何后续的预定作业。
该项目在SQL 2012中使用SSIS项目部署模型。然后,第三方调度工具调用部署的SSIS包。在SSIS目录中,我们使用Execute选项生成一个SQL脚本以传递给调度程序。编辑此脚本以添加参数以确保作业运行SYNSCHRONOUSLY(即调用者一直等待作业完成)。 SQL脚本从调度工具运行,只在完成后移动到下一个作业。
问题是当SSIS包失败时,调度工具没有收到返回码。如果SSIS包失败,它包含捕获并发送带有错误通知的电子邮件的步骤,因此我们确实有失败的视图。但是,无论作业是否成功完成,调度流程中的任何相关作业也会运行。是否有一个参数强制将返回代码发送到第三方调度工具?
用于执行包的脚本示例:
*Declare @execution_id bigint
EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Extract_Job.dtsx', @execution_id=@execution_id OUTPUT, @folder_name=N'ETL', @project_name=N'ETL', @use32bitruntime=False, @reference_id=Null
Select @execution_id
DECLARE @var0 smallint = 1
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, @object_type=50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=@var0
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, @object_type=50, @parameter_name=N'SYNCHRONIZED', @parameter_value= 1; -- turn on synchronized execution
EXEC [SSISDB].[catalog].[start_execution] @execution_id
GO*
我尝试过的事情
答案 0 :(得分:3)
在存储过程中制作了我的SYNCHRONOUS。使用以下
EXEC [SSISDB].[catalog].[create_execution]
@package_name = N'FixProductType.dtsx',
@execution_id = @execution_id OUTPUT,
@folder_name = N'BI',
@project_name = N'DataCleaning',
@use32bitruntime = False;
EXEC [SSISDB].[catalog].[set_execution_parameter_value]
@execution_id,
@object_type = 50,
@parameter_name = N'LOGGING_LEVEL',
@parameter_value = 1;
EXEC [SSISDB].[catalog].[start_execution] @execution_id;
DECLARE @status AS BIGINT = 1;
WHILE(@status = 1 OR @status = 2 OR @status = 5 OR @status= 8)
BEGIN
PRINT @status
PRINT 'waiting 5 seconds for Package to finish'
WAITFOR DELAY '00:00:5';
SET @status = (SELECT [Status] FROM SSISDB.[catalog].[executions]
WHERE execution_id = @execution_id);
END
答案 1 :(得分:2)
虽然使用T-SQL执行SSIS包似乎确实有效但是看起来DTExec仍然更合适和稳定。我发现使用新版本的DTExec确实有一个选项(文档记录不清)来传递参数以允许同步处理。使用此方法还允许返回退出代码,这是我在使用T-SQL选项时遇到的问题。
脚本示例:
DTExec.exe /ISSERVER "\SSISDB\project\package_name.dtsx" /SERVER "server_name" /Par "$ServerOption::SYNCHRONIZED(Boolean)";True
旧版本的dtexec不支持新选项,如果服务器上都有新版本,请确保执行新版本。要检查搜索路径中的版本(默认),请使用“WHERE DTEXEC”。输入“DTEXEC /?”并检查新选项是否出现在帮助文本中,如果没有,则在命令执行前加上正确的路径位置。
新版本位置
C:\ Program Files \ Microsoft SQL Server \ 110 \ DTS \ Binn \ DTExec.exe
旧版本位置
C:\ Program Files(x86)\ Microsoft SQL Server \ 110 \ DTS \ Binn \ DTExec.exe
答案 2 :(得分:1)
您可以使用[catalog].[executions]
视图和@execution_id
,如本文所述:
http://sqlblog.com/blogs/jamie_thomson/archive/2011/07/16/ssis-logging-in-denali.aspx
获取执行结果?
通常我会期望start_execution
存储过程会返回一个结果,但是doco并没有指出这一点。尽管不能尝试。
DECLARE @Result INT
EXEC @Result = [SSISDB].[catalog].[start_execution] @execution_id
SELECT @Result