4

我是 SSIS/SQL 的新手,因此以下命名参考可能不正确,但我希望传达问题的要点

我使用的调度工具在 SQL 2012 中执行已部署的 SSIS 包,该工具需要指示 SSIS 包何时失败,然后停止运行任何后续调度作业。

该项目使用 SQL 2012 中的 SSIS 项目部署模型。部署的 SSIS 包然后由第 3 方调度工具调用。在 SSIS 目录中,我们使用 Execute 选项生成 SQL 脚本以传递给调度程序。编辑此脚本以添加一个参数以确保作业同步运行(即调用者一直等待直到作业完成)。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*

我尝试过的事情

  • 使用 DTSEXEC 命令。但是,这不会发送返回码并且也同步运行,它需要同步运行
  • 第 3 方调度程序有一个用于 SSIS 目录的插件,但有一个未解决的错误,因此不适用于当前版本
4

3 回答 3

5

在存储过程中使我的同步。使用了以下

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
于 2014-01-10T22:45:05.860 回答
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

于 2013-05-04T15:54:57.500 回答
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
于 2013-04-09T06:25:34.527 回答