[英]If exists UPDATE else INSERT for each row of a table
我有一个名为tableFrom的表要插入名为tableTo的表中。 插入工作正常,但如果我再次插入相同的值,我有一个重复的键错误。 所以我想只更新已经存在的行。 我知道命令ON DUPLICATE with MySQL,遗憾的是在SQL Server中丢失了。
如果我只想检查一个精确的行,很容易:
IF EXISTS PK = @PK
但是我试图在整张桌子上做这件事,我不知道是否有可能。 我想用光标检查每一行,我是SQL的新手。
这是我想出的:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
IF EXISTS (
SELECT
1
FROM
tableFrom F,
tableTo T
WHERE
T.product = F._product
)
BEGIN
UPDATE
tableTo
SET
T.something = F.something
FROM
tableTo T
INNER JOIN
tableFrom F
ON
T.product = F._product
END
ELSE
BEGIN
INSERT INTO tableTo
(product,
something)
SELECT
F._product,
F.something
FROM
tableFrom F
END
COMMIT TRANSACTION
UPDATE部分工作正常,但没有INSERT完成。
EDIT1:
试过这段代码:
MERGE tableTo AS T
USING tableFrom AS S
ON (T.product= S._product)
WHEN NOT MATCHED BY TARGET
THEN INSERT(product, something) VALUES(S._product, S.something)
WHEN MATCHED
THEN UPDATE SET T.Something= S.Something
出现以下错误:“MERGE”附近的语法不正确。您可能需要将当前数据库的兼容级别设置为更高的值才能启用此功能。请参阅ALTER DATABASE的SET COMPATIBILITY_LEVEL选项的帮助。
EDIT2:
我搜索了上面的错误消息,似乎是由于MERGE语句之前的最后一行末尾缺少一个分号。 MERGE命令工作正常!
它并没有丢失。 SQL Server实现标准 MERGE
语句,该语句允许您指定在源和目标之间发生匹配时发生的情况。 查看文档以获取示例。
匹配是使用可能涉及许多列的条件进行的。 MERGE
允许您在以下情况下执行INSERT,UPDATE或DELETE:
这样,您可以更新现有行,插入仅存在于源中的行,删除仅出现在目标中的行。
在您的情况下,您可以执行以下操作:
MERGE tableTo AS T
USING tableFrom AS S
ON (T.product= S._product)
WHEN NOT MATCHED BY TARGET
THEN INSERT(product, something) VALUES(S._product, S.something)
WHEN MATCHED
THEN UPDATE SET T.Something= S.Something
OUTPUT $action, Inserted.*, Deleted.*;
此语句将根据需要插入或更新行,并返回使用OUTPUT
子句插入或覆盖的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.