如何在 SSMS 2008 中执行 IF EXISTS UPDATE ELSE INSERT 语法
How to execute IF EXISTS UPDATE ELSE INSERT syntax in SSMS 2008
IF EXISTS THEN UPDATE ELSE INSERT 在 SQL Server 2008
中未正确执行
我被告知 MERGE 可能会有用,但我的数据似乎不适用于此 - 它尝试更新记录两次,因为源中有重复记录 table
IF EXISTS (select 1
from SCM_Top_Up_Operational O
join SCM_Top_Up_Rolling R ON O.String = R.string)
BEGIN
UPDATE O SET O.Date_Added = R.Date_Added,
O.Real_Exfact = R.Real_Exfact,
O.Excess_Top_Up = R.Excess_Top_Up
FROM SCM_Top_Up_Operational O JOIN SCM_Top_Up_Rolling R ON O.String = R.String
WHERE O.String = R.string
AND R.Date_Added > O.Date_Added;
END
ELSE
BEGIN
INSERT INTO SCM_Top_Up_Operational (String,Date_Added,Real_Exfact,Article_ID,Excess_Top_Up,Plant)
SELECT R.String,R.Date_Added,R.Real_Exfact,R.Article_ID,R.Excess_Top_Up,R.Plant
FROM SCM_Top_Up_Rolling R
WHERE R.String NOT IN (SELECT String FROM SCM_Top_Up_Operational)
END
预期的结果是更新 'Operational' table 中的任何记录,并将最新的记录添加到 'rolling' table - 这是通过在 'String' 字段上加入,该字段在 'Operational' table 中是唯一的,但在 'Rolling' table 中是重复的。唯一的区别是 'Date_Added' - 这是我从 'Rolling' table 中的最新记录更新的地方。如果没有匹配项,则转到 INSERT 语句,它将插入 'Rolling' table 中但不在 'Operational' table 中的任何行。我研究了许多其他线程,这个语法看起来是正确的。
问题是什么:
如果我执行整个语句,UPDATE 部分工作正常,但 ELSE INSERT 什么都不做 - 但是,如果我 运行 INSERT 单独执行,它也工作正常。我的猜测是我在语法中遗漏了一些小东西。如前所述,我被建议使用 MERGE,但由于我的数据的性质 - MERGE 中的 ON 语句会从源 table 中找到主键两次,并且 returns 会出错。有什么想法我可能在这段代码中遗漏了什么吗?我对 SQL 相当满意,但这些类型的陈述对我来说有些陌生..
您可以简单地编写此查询。
UPDATE
O
SET
O.Date_Added = R.Date_Added,
O.Real_Exfact = R.Real_Exfact,
O.Excess_Top_Up = R.Excess_Top_Up
FROM
SCM_Top_Up_Operational O JOIN SCM_Top_Up_Rolling R ON O.String = R.String
WHERE
O.String = R.string
AND R.Date_Added > O.Date_Added;
INSERT INTO SCM_Top_Up_Operational
(String,Date_Added,Real_Exfact,Article_ID,Excess_Top_Up,Plant)
SELECT
R.String,
R.Date_Added,R.Real_Exfact,R.Article_ID,R.Excess_Top_Up,R.Plant
FROM
SCM_Top_Up_Rolling R
WHERE
R.String NOT IN (SELECT String FROM SCM_Top_Up_Operational)
IF EXISTS THEN UPDATE ELSE INSERT 在 SQL Server 2008
中未正确执行我被告知 MERGE 可能会有用,但我的数据似乎不适用于此 - 它尝试更新记录两次,因为源中有重复记录 table
IF EXISTS (select 1
from SCM_Top_Up_Operational O
join SCM_Top_Up_Rolling R ON O.String = R.string)
BEGIN
UPDATE O SET O.Date_Added = R.Date_Added,
O.Real_Exfact = R.Real_Exfact,
O.Excess_Top_Up = R.Excess_Top_Up
FROM SCM_Top_Up_Operational O JOIN SCM_Top_Up_Rolling R ON O.String = R.String
WHERE O.String = R.string
AND R.Date_Added > O.Date_Added;
END
ELSE
BEGIN
INSERT INTO SCM_Top_Up_Operational (String,Date_Added,Real_Exfact,Article_ID,Excess_Top_Up,Plant)
SELECT R.String,R.Date_Added,R.Real_Exfact,R.Article_ID,R.Excess_Top_Up,R.Plant
FROM SCM_Top_Up_Rolling R
WHERE R.String NOT IN (SELECT String FROM SCM_Top_Up_Operational)
END
预期的结果是更新 'Operational' table 中的任何记录,并将最新的记录添加到 'rolling' table - 这是通过在 'String' 字段上加入,该字段在 'Operational' table 中是唯一的,但在 'Rolling' table 中是重复的。唯一的区别是 'Date_Added' - 这是我从 'Rolling' table 中的最新记录更新的地方。如果没有匹配项,则转到 INSERT 语句,它将插入 'Rolling' table 中但不在 'Operational' table 中的任何行。我研究了许多其他线程,这个语法看起来是正确的。
问题是什么:
如果我执行整个语句,UPDATE 部分工作正常,但 ELSE INSERT 什么都不做 - 但是,如果我 运行 INSERT 单独执行,它也工作正常。我的猜测是我在语法中遗漏了一些小东西。如前所述,我被建议使用 MERGE,但由于我的数据的性质 - MERGE 中的 ON 语句会从源 table 中找到主键两次,并且 returns 会出错。有什么想法我可能在这段代码中遗漏了什么吗?我对 SQL 相当满意,但这些类型的陈述对我来说有些陌生..
您可以简单地编写此查询。
UPDATE
O
SET
O.Date_Added = R.Date_Added,
O.Real_Exfact = R.Real_Exfact,
O.Excess_Top_Up = R.Excess_Top_Up
FROM
SCM_Top_Up_Operational O JOIN SCM_Top_Up_Rolling R ON O.String = R.String
WHERE
O.String = R.string
AND R.Date_Added > O.Date_Added;
INSERT INTO SCM_Top_Up_Operational
(String,Date_Added,Real_Exfact,Article_ID,Excess_Top_Up,Plant)
SELECT
R.String,
R.Date_Added,R.Real_Exfact,R.Article_ID,R.Excess_Top_Up,R.Plant
FROM
SCM_Top_Up_Rolling R
WHERE
R.String NOT IN (SELECT String FROM SCM_Top_Up_Operational)