gpt4 book ai didi

sql-server - SQL Server : Can Merge Insert Conditionally or Update a Source Table?

转载 作者:行者123 更新时间:2023-12-01 19:29:20 25 4
gpt4 key购买 nike

我正在使用 SQL Server 2008 并在两个表之间同步数据,如下所示:

    MERGE into Stock as Target
using StockHistory as Source on Target.SrNo = Source.SrNo
When Matched then
# Update record to target table
When Not Matched then
# Insert record to target table
When Not Matched By Source Then
# Update Source Table - Current Record

问题1:我想有条件地插入记录“当不匹配时”触发。例如如果源表列 refSrNo_StockCompany 为 null,则不应插入目标中。

问题 2:如果目标表“Stock”与源“When Not Matched By Source then”不匹配,则应更新源表 --> IsSoldOut = 'Yes'。

请建议我如何实现这一目标。

谢谢

最佳答案

对于问题 1:只需添加 AND条件为WHEN NOT MATCHED子句:

WHEN NOT MATCHED AND Source.[refSrNo_StockCompany] IS NOT NULL THEN
# Insert record to target table

对于问题2:不能直接完成,因为只能修改TARGET表。然而,它可以在第二步中间接完成。诀窍是使用 OUTPUT子句将已更新的记录捕获到临时表中(并且,我们不使用 $action 来区分 INSERT 和 UPDATE,而是从 deleted 表中获取,根据定义,该表永远不会在 INSERT 操作中填充)。然后,在对源表进行 UPDATE 时,您可以使用该列表作为 JOIN,以过滤掉该列表中的任何内容。临时表中的记录是由于匹配而不需要更新的记录。源表中不在该临时表中的任何记录都表示在 WHEN NOT MATCHED BY SOURCE 上匹配的所有记录。健康)状况。当然,通过 WHEN NOT MATCHED 插入的记录子句将全部显示为 NULL临时表中的记录(因为 deleted 表中没有任何内容可用于 INSERT 操作),并且可以轻松地从 UPDATE 中过滤掉这些记录。

-- do this before the MERGE
CREATE TABLE #UpdatedRecords (SrNo INT);

BEGIN TRY
BEGIN TRAN;

MERGE ...
-- add this to the end of the MERGE query
OUTPUT DELETED.SrNo
INTO #UpdatedRecords (SrNo);

-- optionally do this after the MERGE
DELETE upd
FROM #UpdatedRecords upd
WHERE upd.SrNo IS NULL;

-- do this after the MERGE
UPDATE sh
SET sh.IsSoldOut = 'Yes'
FROM StockHistory sh
WHERE NOT EXISTS (
SELECT upd.SrNo
FROM #UpdatedRecords upd
WHERE upd.SrNo = sh.SrNo
);

COMMIT TRAN;

END TRY
BEGIN CATCH
ROLLBACK TRAN;
DECLARE @Error NVARCHAR(4000) = ERROR_MESSAGE();
RAISERROR(@Error, 16, 1);
END CATCH;

如果您想确保这两个语句作为单个操作的一致性,就像使用 MERGE 时一样(如果有效),则将 MERGE 包装起来。和 UPDATEBEGIN TRANCOMMIT TRAN .

关于sql-server - SQL Server : Can Merge Insert Conditionally or Update a Source Table?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26932069/

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