2013-04-08 46 views
2

我是新来的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', @[email protected]_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', @[email protected] 
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命令。但是这不会发送返回代码,并且同步运行,并且需要同步运行
  • 第三方调度程序具有SSIS目录的插件,但有一个未解决的错误,因此无法在当前版本上工作

回答

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

+0

只是好奇。我试图决定走哪条路。你有没有证据表明DTExec比“start_execution”过程更稳定? – 2016-04-27 15:47:10

+0

我不能评论DTEXEC是否更稳定,因为需要使用第三方调度工具,我正在使用DTEXEC。如果您使用SQL代理,我认为使用Start_execution过程是有意义的。 – Peffa 2016-06-13 19:21:28

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

谢谢,这似乎确实会返回我想要的信息,但我需要它将退出代码作为执行的一部分返回给调用程序。 我会尝试将其作为通话的一部分。 – Peffa 2013-04-10 12:12:55

+0

你能澄清哪一个工作?捕获SP结果或使用catalog.executions?返回到调用程序的问题是什么?它期待什么?一个DOS错误级别? – 2013-04-10 23:05:21

+0

它期望一个DOS错误级别。对于警告/错误,标准通常为0,表示成功或更高。在SQL代码中,我可以返回结果并使用case语句对我需要的代码进行重新编码,但调度程序仍然没有选择它。我现在正在将故障排除回调度软件,并尝试执行另一种方法。 – Peffa 2013-04-12 06:14:29

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

你是不是故意说“...让我的异步”? – 2016-04-27 15:45:35