2014-09-19 106 views
1

我想将一个表中的值合并到另一个表中。其中一个值是一个条件值,但它看起来像我没有正确得到语法。最初,我使用了IF-THEN-ELSE语句,但建议使用CASE语句。带条件语句的SQL INSERT IF then then

这里的要点是失败的语法:如果我不落实的情况

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字段。

+0

您必须使用大小写切换[看到这篇文章](http://stackoverflow.com/questions/15820405/sql-insert-into-table-with-select-case-values) – Max 2014-09-19 17:22:19

+0

摆脱如果和使用一个案例。发布完整的SQL,如果你想要更多的细节:) – UnhandledExcepSean 2014-09-19 17:22:45

+0

@Max,我已经更新了我的SQL语句,请参考,谢谢! – user118190 2014-09-19 17:45:48

回答

2

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

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

+0

我刚刚弄明白了我自己,当我加载SO来更新我的线程时,我注意到了你的答案。我不能监督这个简单的问题。谢谢! – user118190 2014-09-19 20:54:39

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 
+0

我改变我的MERGE为一个UPDATE和INSERT语句,因为你有,我仍然得到一个语法错误“不正确的语法附近'='。”在t1.Zip和CASE之间的INSERT语句中。有什么建议么?谢谢! – user118190 2014-09-19 19:56:20

+0

因为我已经删除了前面的零件,所以需要删除最后一个零件 – UnhandledExcepSean 2014-09-19 19:57:18

+0

哦,几乎忘记了,我还通过CASE语句结尾处的两个额外右括号(即END关键字后)更改了代码。你会同意吗? – user118190 2014-09-19 19:57:59