4

私は SSIS/SQL を初めて使用するので、次の命名参照は正しくない可能性がありますが、問題の要点を伝えたいと考えています

私が使用しているスケジューリング ツールは、SQL 2012 で展開された SSIS パッケージを実行します。このツールは、SSIS パッケージが失敗したことを示し、その後のスケジュールされたジョブの実行を停止する必要があります。

The project uses the SSIS project deployment model in SQL 2012. デプロイされた SSIS パッケージは、サード パーティのスケジュール ツールによって呼び出されます。SSIS カタログでは、実行オプションを使用して、スケジューラに渡す 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 コマンドを使用します。ただし、これは戻りコードを送信せず、同期的に実行されるため、同期的に実行する必要があります
  • サード パーティのスケジューラには SSIS カタログ用のプラグインがありますが、未解決のバグがあるため、現在のバージョンでは動作しません。
4

3 に答える 3

5

ストアドプロシージャ内で鉱山を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
于 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ますが、ドキュメントはこれを示しません。試してみても損はありません。

DECLARE @Result INT
EXEC @Result = [SSISDB].[catalog].[start_execution] @execution_id
SELECT @Result
于 2013-04-09T06:25:34.527 に答える