带有条件语句的SQL INSERT如果那么

时间:2014-09-19 17:16:31

标签: sql-server tsql merge

我正在尝试将值从一个表合并到另一个表。其中一个值是条件值,但看起来我没有正确获得语法。最初,我使用的是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

如果我没有实现条件,那么这个MERGE语句就可以正常工作,即只需设置t1.Zip = t2.Zip,但当然这是避免使用t2.ZipExt字段。

2 个答案:

答案 0 :(得分:2)

  

MERGE语句必须以分号(;)

结束

您尚未使用分号终止MERGE。你已经终止了BEGIN-END。移动分号。

答案 1 :(得分:0)

我从未真正关心合并命令。有时我可以看到它使用它,但在大多数情况下,它比我喜欢我的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