2013-04-08 74 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