gpt4 book ai didi

sql - 更新声明?

转载 作者:行者123 更新时间:2023-12-04 20:21:17 28 4
gpt4 key购买 nike

我有一个每周一执行每周运行的 SSIS 作业。目前,这项工作从电子表格中提取数据,通过聚合运行它(因为我只需要年度总和),然后将数据放入暂存表 [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] 上的年度金额。这样,主表将随着时间的推移而增长。

由于每次作业运行时暂存表都会被截断,因此我不能直接将数据加载到主表中。从周一开始,我将收到的数据将仅限当年(和 future 几年),他们删除了 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

更新:

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

最佳答案

您可以使用 MERGE 而不是 Update 来实现此目的。 Merge 将在键匹配的地方进行更新,并在目标表中找不到源键(来自临时表)的地方进行插入。

参见 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
);

关于sql - 更新声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18639144/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com