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|

由于此报告每周运行一次,因此我需要根据工作更新当前年份(以及接下来的年份)。因此,我需要一个脚本,该脚本将从 Staging Table 中提取数据并更新 Main table 上的年度金额[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'.

我添加了一个屏幕截图,以便您也可以看到表格的设置。 在此处输入图像描述

更新:

我将脚本添加到我的 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

3

您可以通过使用 aMERGE而不是Update. Merge 将在键匹配的位置进行更新,并在目标表中找不到源键(来自临时表)的位置进行插入。

有关合并的更多信息,请参阅此页面。示例“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
                );
于 2013-09-05T14:42:00.380 回答