【问题标题】:SQL INSERT with conditional statement IF THEN ELSE带有条件语句的 SQL INSERT IF THEN ELSE
【发布时间】:2014-09-19 17:16:31
【问题描述】:

我正在尝试将值从一个表合并到另一个表。其中一个值是条件值,但看起来我没有正确理解语法。最初,我使用的是 IF-THEN-ELSE 语句,但被建议改用 CASE 语句。

这是失败的语法要点:

CREATE PROCEDURE EmployeeMerge
AS 
BEGIN
    SET NOCOUNT ON;
    MERGE INTO Employee AS t1  
    USING 
        (SELECT 
               EmployeeName,
               Zip,
               UpdateDate 
        FROM table2) AS t2
        ON (t1.EmployeeID = t2.EmployeeID)
    WHEN MATCHED AND t2.UpdatedDate > t1.UpdatedDate THEN 
        UPDATE 
        SET 
            t1.EmployeeName = s.EmployeeName, 
            t1.Zip =
                (CASE 
                    WHEN t2.ZipExt IS NULL OR t2.ZipExt = '' THEN t2.Zip 
                    ELSE (t2.Zip + '-' + t2.ZipExt)
                END),
            t1.UpdatedDate = t2.UpdateDate
    WHEN NOT MATCHED THEN
        INSERT (EmployeeName,  
            Zip,  
            ModDate)
        VALUES 
            (t2.Name, 
            (CASE 
                WHEN t2.ZipExt IS NULL OR t2.ZipExt = '' THEN t2.Zip 
                ELSE (t2.Zip + '-' + t2.Zip_Ext)
            END),
            t2.UpdatedDate)
    OUTPUT 
        deleted.*, 
        $action, 
        inserted.* 
END; **-- A MERGE statement must be terminated by a semi-colon (;)**
GO

如果我不实现条件,即简单地设置 t1.Zip = t2.Zip,则此 MERGE 语句可以正常工作,但当然,这是避免 t2.ZipExt 字段。

【问题讨论】:

  • 你必须使用大小写开关see this post
  • 去掉 if 并使用 case。如果您想了解更多细节,请发布完整的 SQL :)
  • @Max,我已经更新了我的SQL语句,请参考,谢谢!
  • @SpectralGhost,我已经更新了我的SQL语句,请参考,谢谢!
  • 好的,我们解决了原来的问题。您现在遇到什么问题?

标签: sql-server tsql merge


【解决方案1】:

MERGE 语句必须以分号 (;) 结束

您没有用分号终止 MERGE。您已终止 BEGIN-END。移动分号。

【讨论】:

  • 我自己想通了,当我加载 SO 来更新我的线程时,我注意到了你的回答。我不能监督这么简单的问题。谢谢!
【解决方案2】:

我从来没有真正关心过合并命令。有时我可以看到使用它,但在大多数情况下,它比我喜欢的 SQL 更复杂。

UPDATE e
SET     e.EmployeeName=t1.EmployeeName
    ,   e.Zip=CASE 
                WHEN t1.ZipExt IS NULL OR t1.ZipExt = '' THEN t1.Zip 
                ELSE (t1.Zip + '-' + t1.ZipExt)
            END
    ,   e.UpdatedDate=t1.UpdatedDate
FROM Employee e
INNER JOIN Table t1 ON e.EmployeeID = t1.EmployeeID
WHERE t1.UpdatedDate > e.UpdatedDate

INSERT INTO Employee (EmployeeName,Zip,UpdatedDate)
    SELECT
            t1.EmployeeName
        ,   t1.Zip=CASE 
                WHEN t1.ZipExt IS NULL OR t1.ZipExt = '' THEN t1.Zip 
                ELSE (t1.Zip + '-' + t1.ZipExt)
            END
        ,   t1.UpdatedDate
    FROM Table t1
    LEFT JOIN Employee e ON e.EmployeeID = t1.EmployeeID
    WHERE e.EmployeeID IS NULL

【讨论】:

  • 我像你一样将我的 MERGE 更改为 UPDATE 和 INSERT 语句,但我仍然收到“'=' 附近的语法错误”的语法错误。在 t1.Zip 和 CASE 之间的 INSERT 语句中。有什么建议么?谢谢!
  • 需要移除末端括号,因为我移除了前括号
  • 哦,差点忘了,我还用 CASE 语句末尾的两个额外右括号(即 END 关键字之后)更改了您的代码。你同意吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多