2013-09-05 99 views
3

我有一個每星期一運行一週的SSIS工作。目前,作業從電子表格中提取數據,通過聚合運行它(因爲我只需要每年SUM),然後將數據放入臨時表[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 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'. 

我添加了一個屏幕快照,以便您可以看到表格的設置。 enter image description here

UPDATE:

我添加腳本到SQL任務在我的SSIS包。當我運行該作業時,它返回了以下錯誤消息。

[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. 
+1

你能後的'dbo.HRIS_RecruitingGL'表的結構,包括數據類型和約束。 –

+1

在您從暫存表中選擇時,您不包括'Amount'字段。 –

+0

我在最後添加了AND數量,它仍然給我一個「FROM字附近的語法錯誤」錯誤。 –

回答

3

您可以通過使用一個MERGE代替Update來實現這一目標。合併將執行鍵匹配的更新,並在目標表中找不到源鍵(來自臨時表)中的插入。

有關合並的更多信息,請參見this page。示例「A」是您需要的合併類型。

看着你的合併,你沒有在暫存表中包括數量字段,並且你正在計算財政年度,這意味着你根本沒有使用臨時表。

我希望合併看起來像以下,(所有我做的是改變了SELECT條款的臨時表)

MERGE dbo.HRIS_RecruitingGL AS tgt 
USING (
     SELECT FiscalYear, 
       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 
       ); 
+0

我也這麼認爲。我試圖從另一個項目中使用合併聲明,只是修改它,但我可以得到它的工作。 –

+1

更新您的原始文章以包含合併聲明和兩個表的結構的一些細節。有了這些信息,你將得到你需要的答案。 –

+0

我已更新信息。我對這個有點新,所以我相信我可能在我的腳本的某個地方犯了一個菜鳥錯誤。感謝您的指導。 –