3

毎週月曜日に実行される SSIS ジョブがあります。現在、ジョブはスプレッドシートからデータを取得し、集計を実行して (年間の SUM のみが必要なため)、データを Staging Table に配置し[Staging.HRIS_RecruitingGL]ます。

両方のテーブルの構造は同じです。

TABLE [dbo].[HRIS_RecruitingGL](
      [FiscalYear] [varchar](50) NOT NULL,
      [Amount] [decimal](20, 2) NOT NULL) 

ステージング テーブルにあるデータは次のようになります。

|FiscalYear|Amount|
|2012      |250.25|
|2013      |175.13|

このレポートは毎週実行されるため、現在の年 (および次の年) をジョブで更新する必要があります。そのため、ステージング テーブルからデータを取得し、メイン テーブルの年間金額を更新するスクリプトが必要[dbo.HRIS_RecruitingGL]です。このようにして、年が進むにつれてメインテーブルが大きくなります。

ジョブが実行されるたびにステージング テーブルが切り捨てられるため、データをメイン テーブルに直接ロードすることはできません。月曜日以降、私が受け取るデータは現在の年 (および将来の年) のみのものになり、2012 年のデータは削除されました。しかし、私はそれを自分のテーブルに保持する必要があるので、メインテーブルの切り捨てはオプションではありません (それは私の元の方法で、テーブルを切り捨てて新しいデータをロードする、非常に簡単です)

これが私が使用しようとしたMergeステートメントです。

MERGE dbo.HRIS_RecruitingGL AS tgt 
USING (
    SELECT  DATENAME(YEAR, GETDATE()) AS FiscleYear AND Amount,
    FROM Staging.HRIS_RecruitingGL
    ) AS rgl ON rgl.FiscalYear = tgt.FiscalYear
WHEN    MATCHED
    THEN    UPDATE
        SET tgt.FiscalYear = rgl.FiscalYear,
            tgt.Amount = rgl.Amount
WHEN    NOT MATCHED BY TARGET
    THEN    INSERT  (
                FiscalYear,
                Amount
            )
        VALUES  (
                rgl.FiscalYear,
                rgl,Amount
            );

ステージング テーブルから現在の年の金額を単純に更新し、翌年の開始時に新しい行を追加してその情報も更新するために使用できるスクリプトは何でしょうか?

ご協力いただきありがとうございます。

更新: あなたが提案したようにスクリプトを変更しましたが、次の構文エラーを受け取りました。

Msg 207, Level 16, State 1, Line 3
Invalid column name 'FiscleYear'.
Msg 207, Level 16, State 1, Line 7
Invalid column name 'FiscalYear'.

テーブルのセットアップも確認できるように、スクリーン ショットを追加しました。 ここに画像の説明を入力

アップデート:

SSIS パッケージの SQL タスクにスクリプトを追加しました。ジョブを実行すると、次のエラー メッセージが返されました。

[Execute SQL Task] Error: Executing the query "MERGE   dbo.HRIS_RecruitingGL AS tgt    
USING   (..." failed with the following error: "The MERGE statement attempted to 
UPDATE or DELETE the same row more than once. This happens when a target row matches 
more than one source row. A MERGE statement cannot UPDATE/DELETE the same row of the 
target table multiple times. Refine the ON clause to ensure a target row matches at 
most one source row, or use the GROUP BY clause to group the source rows.". Possible 
failure reasons: Problems with the query, "ResultSet" property not set correctly, 
parameters not set correctly, or connection not established correctly.
4

1 に答える 1