web-dev-qa-db-ja.com

SQLエージェントジョブを3回続けて実行する

SQLエージェントジョブを3回続けて実行するにはどうすればよいですか?

データウェアハウスプロジェクトを作成しています。 Flatfile Legacy FolderからデータをETLし、DimテーブルとFactテーブルを作成します。

SSISプロジェクト環境変数(FlatfileFolder)セット:2018年3月

  1. 2018年3月のステージングデータベースへのETLフラットファイルのインポート
  2. 顧客ディメンションテーブルの作成
  3. 製品ディメンションテーブルを作成する
  4. SalesTransactionファクトテーブルを作成する

これを3回続けて実行し、プロジェクト環境変数(FlatfileFolder)を2018年4月に変更します。4つのジョブを再度実行してから、プロジェクト環境変数(FlatfileFolder)を2018年5月に変更して、4つのジョブステップを再度実行します。 (理論的には、すべての履歴ファイルを抽出して一度にロードするように設計されているはずですが、これを設計するのではなく、継承するだけです。)

以下のこのスタックリンクは、エンドレスループについて話し、それを3回だけ実行し、環境変数を変更します。

無限ループでジョブを実行

オプション:

(a)12ステップのSQLエージェントジョブを書き込み、

(b)または、どういうわけかステップ4の後、成功したらステップ1に戻りますか?これを3回だけ実行するにはどうすればよいですか?

最終的には、後の月に5〜10回続けてジョブを実行したい場合があります。 SQL環境で実行しようとする場合は、必要がない限り、C#またはPowershellを控えます。

データを処理しています。

おかげで、

2
user173948

私はそれをこのように解決すると思います:

  • 作業を行う必要があるかどうかを識別するdrivingストアドプロシージャを作成します。これは、次のフォルダ月を処理するためにテーブルをチェックすることを意味する場合があります。このdrivingテーブルには、処理する必要のあるフォルダー(月)の数が事前に入力されます。フォルダーを正しい順序で処理できるように、処理するフォルダーの順序を決定するメソッドを含めることができます。
  • 確認するWHILE LOOPを設定します[〜#〜] [〜#〜]作業が行われるかどうか。カスタムストアドプロシージャ sp_sp_start_job_wait を使用して、4つのステップを持つジョブを呼び出します。この手順はジョブを開始し、完了するまで待機します。
  • ジョブが正常に完了したら、完了としてマークしますまたはdelete処理したばかりの月のフォルダー行。
  • WHILE LOOPは、さらに作業が行われるかどうかを確認するために繰り返し実行します。

プロセス全体を開始するには、drivingストアドプロシージャを呼び出すだけです。


また、SQLエージェントジョブの必要性を完全に排除し、組み込みのストアドプロシージャを使用して、前に説明したdrivingストアドプロシージャから直接SSISパッケージを呼び出すこともできます。例えばssisdb.catalog.create_executionssisdb.catalog.start_execution。そのプロセスについて説明した優れたブログ投稿があります SQL ServerストアドプロシージャからIntegration Services(SSIS)パッケージを実行する方法 。その投稿の要点を要約すると:

create procedure dbo.execute_ssis_package_sample
 @output_execution_id bigint output
as
begin
 declare @execution_id bigint
 exec ssisdb.catalog.create_execution 
  @folder_name = 'mssqltips'
 ,@project_name = 'exec-ssis-stored-proc-ssis-sample'
 ,@package_name = 'Sample.dtsx'
 ,@execution_id = @execution_id output
 exec ssisdb.catalog.start_execution @execution_id
 set @output_execution_id = @execution_id
end
  • ストアドプロシージャssisdb.catalog.create_execution(SSIS 2012の新機能)が呼び出され、SSISパッケージ実行のインスタンスが作成されます。
  • フォルダー、プロジェクト、およびパッケージをssisdb.catalog.create_executionストアドプロシージャに渡します。
  • ssisdb.catalog.create_executionは、@ execution_idという名前の出力パラメーターを返します。 SSISパッケージの実行を開始したり、パッケージ実行のステータスを確認したりするには、この値が必要です。
  • Ssisdb.catalog.start_executionストアドプロシージャ(SSIS 2012の新機能)が呼び出され、パッケージの実際の実行が開始されます。
  • SSISパッケージの実行は非同期です。つまり、ssisdb.catalog.start_executionストアドプロシージャを呼び出すときに、パッケージの完了を待機していません

ssisdb.catalog.start_executionのデフォルトの動作はasynchronousを実行することであるという事実を強調しましたが、 this post に記載されているようにその回避策があります Tim Mitchell による。セクションパッケージの同期実行を参照してください。その投稿からの引用:

これは比較的簡単な修正です。デフォルトの動作は[カタログ]。[start_execution]を非同期で実行することですが、この動作を実行ごとにオーバーライドできるシステムパラメータがあります。パラメーター名はSYNCHRONIZEDであり、0(同期されていない、デフォルトの動作)または1(同期されている)のいずれかの値が必要です。この値を上書きして1に設定すると、[catalog]。[start_execution]の呼び出しは、パッケージの実行が完了するまで戻りません。つまり、パッケージがまだ実行されている限り、[catalog]。[start_execution]が実行されます。このパラメーターを追加するための構文を以下に示します。

-- Create the execution object
DECLARE @execution_id BIGINT
EXEC [SSISDB].[catalog].[create_execution] 
    @package_name = N'Package1.dtsx'
    , @project_name = N'Project1'
    , @folder_name = N'Folder1'
    , @use32bitruntime = False
    , @reference_id = NULL
    , @execution_id = @execution_id OUTPUT

-- System parameters
EXEC [SSISDB].[catalog].[set_execution_parameter_value] 
    @execution_id
    , @object_type = 50                     -- System parameter
    , @parameter_name = N'SYNCHRONIZED'
    , @parameter_value = 1

-- Execute the package
EXEC [SSISDB].[catalog].[start_execution] @execution_id

示されているように、パラメーター値(システム、プロジェクト、パッケージのパラメーターを含む)は、[catalog]。[create_execution]の後でかつ[catalog]。[start_execution]の前に追加されます。上記の例では、SYNCHRONIZEDシステムパラメータを1に設定して、[catalog]。[start_execution]がパッケージが完了するまで待機してから、パッケージを返します。

このオーバーライドは1つの問題を解決しますが、別の問題を残します。[catalog]。[start_execution]は同期的に実行されますが、パッケージ実行のステータスを報告しません。ほとんどのワークフローは、実行が終了したことだけでなく、パッケージの実行のステータスを知る必要があります。幸い、そのための回避策もあります。

パッケージが失敗した場合にスクリプトを強制的に失敗させます

この回避策には、単純な実行パラメータ以上のものが必要なので、可動部分が多くなります。簡単に言えば、呼び出したパッケージが失敗した場合にT-SQLスクリプトを強制的に失敗させるための設計パターンは次のとおりです。

  • 実行を作成する
  • SYNCHRONIZEDパラメータを1に設定します
  • パッケージを実行する
  • この実行の実行ログを確認し、パッケージが失敗した場合はT-SQLスクリプトを強制的に失敗させます。

前のスクリプトはすでに手順1​​〜3を処理していたので、最後の手順を追加するだけです。これは、必要に応じて単純でも複雑でもかまいませんが、私の例では、[カタログ]。[実行]を確認して、その実行の[ステータス]値を取得するだけです。値が7(成功のステータスID)でない場合、スクリプトはRAISERRORを使用して失敗を生成します。

-- Create the execution object
DECLARE @execution_id BIGINT
EXEC [SSISDB].[catalog].[create_execution] 
    @package_name = N'Package2.dtsx'
    , @project_name = N'Project1'
    , @folder_name = N'Folder1'
    , @use32bitruntime = False
    , @reference_id = NULL
    , @execution_id = @execution_id OUTPUT

-- System parameters
EXEC [SSISDB].[catalog].[set_execution_parameter_value] 
    @execution_id
    , @object_type = 50                     -- System parameter
    , @parameter_name = N'SYNCHRONIZED'
    , @parameter_value = 1

-- Execute the package
EXEC [SSISDB].[catalog].[start_execution] @execution_id

-- Check package status, and fail script if the package failed
IF 7 <> (SELECT [status] FROM [SSISDB].[catalog].[executions] WHERE execution_id = @execution_id)
RAISERROR('The package failed. Check the SSIS catalog logs for more information', 16, 1)
6
Scott Hodgin