我有一个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年的数据。 但我需要将它保存在我的表中,因此不能选择截断Main表(这是我原来的方法,截断表并加载新数据,非常简单)
这是我尝试使用的合并声明。
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.
答案 0 :(得分: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
);