2

SQLServer2008データベースのテーブルに配置されているdatastageからのデータがありますstg_table_outside_data。私たちの側の情報源は、毎朝そのテーブルにデータを入れています。数日分のデータを保持している場所に stg_table_outside_dataデータを移動したい。table_outside_data

stg_table_outside_Dataからデータを挿入してからtable_outside_data切り捨てるストアドプロシージャを作成しましたstg_table_outside_Data。外部のdatastageプロセスは制御できないため、これはすべてSQL Server 2008内で行う必要があります。当初は単純なafterinsertステートメントを使用することを計画していましたが、datastageは100,000行ごとにコミットを実行しています。トリガーは最初のコミットの後に実行され、データステージプロセスでデッドロックエラーが発生します。

アフターインサートを設定して30分待機し、その時間枠内に新しいコミットがないことを確認する方法はありますか?私の問題に対するより良い解決策はありますか?目標は、データをステージングテーブルから作業テーブルに複製せずに取得し、翌朝のロードのためにステージングテーブルを切り捨てることです。

お手数をおかけしますが、よろしくお願いいたします。

4

4 に答える 4

2

これを行う1つの方法はMERGE、SQL Server 2008の新しいステートメントを利用して(MSDNドキュメントこのブログ投稿を参照)、30分程度ごとにSQLジョブとしてスケジュールすることです。

MERGEステートメントを使用すると、ソースデータ(ステージングテーブル)とターゲットデータ(「実際の」テーブル)が特定の基準に一致するかどうかに応じて、操作(INSERT、UPDATE、DELETE、または何もしない)を簡単に定義できます。いいえ。

したがって、あなたの場合、次のようになります。

MERGE table_outside_data AS target
USING stg_table_outside_data AS source 
ON (target.ProductID = source.ProductID)   -- whatever join makes sense for you

WHEN NOT MATCHED THEN
    INSERT VALUES(.......)

WHEN MATCHED THEN 
    -- do nothing
于 2010-01-12T17:12:39.447 に答える
1

これを行うためにトリガーを使用するのではなく、スケジュールされたジョブを使用する必要があります。

于 2010-01-12T17:12:17.580 に答える
0

1日1回、またはジョブスケジューラを使用して、すべてのデータをstg_table_outside_Dataからtable_outside_dataに移動するプロシージャを作成する場合があります。

于 2010-01-12T17:13:46.557 に答える
0

カウントが100,000未満の場合は、トリガーで行カウントを実行します。何もしません。それ以外の場合は、プロセスを実行します。

于 2011-09-26T15:10:18.950 に答える