SQL Server:使用MERGE语句更新两个表

时间:2017-09-29 18:33:34

标签: sql-server tsql stored-procedures merge

我正在尝试使用MERGE语句使用单个源(CTE)更新2个表。当我只使用1次合并时它可以工作,但是当我添加第2次合并时,它会返回错误:

  

Msg 208,Level 16,State 1,Procedure mn_SeoUrl_UpdateBulk,Line 46
  无效的对象名称'cte'。

是否可以使用合并更新2个表?如果有可能,我做错了,我希望有人能告诉我这样做的正确方法是什么。

非常感谢任何帮助。

谢谢。

这是我失败的代码(假col名称):

WITH cte AS 
( 
    SELECT
        [u].[col1], [u].[col2], [u].[col3], 
        CASE                                        
           WHEN [u].[col1] LIKE 'L%' 
              THEN 'c/' + [u].[col2] + '/' + [u].[col3]
           WHEN [u].[col1] LIKE 'M%' 
              THEN 'm/' + [u].[col2] + '/' + [u].[col3]
        END [col4]
    FROM
        (SELECT
             [st1].[col1], [st1].[col2], [st1].[col3]
         FROM
             [dbo].[sourcetable1] [st1]
         INNER JOIN 
             [dbo].[sourcetable2] [st2] ON [st1].[ID] = [st2].[ID]
         WHERE
             [pd].[col2] <> 0) [u]
)
MERGE [dbo].[table1] AS [Target]
USING [cte] AS [Source] ON [Target].[ID] = [Source].[ID]

WHEN MATCHED THEN
    UPDATE 
        SET [Target].[col] = [Source].[col]

WHEN NOT MATCHED BY TARGET THEN
    INSERT ([col])
    VALUES ([Source].[col]);

MERGE [dbo].[tabl2] AS [Target]
USING [cte] AS [Source] ON [Target].[id] = [Source].[id]

WHEN MATCHED THEN
    UPDATE 
        SET [Target].[col] = [Source].[col]

WHEN NOT MATCHED BY TARGET THEN
    INSERT ([col])
    VALUES ([Source].[col]);
END;

1 个答案:

答案 0 :(得分:4)

  

是否可以使用合并更新2个表?

不,无法使用单个合并更新两个表。你必须做两个单独的合并声明。

正如其他人在评论中指出的那样,单个CTE只能用于一个语句,所以如果你做两个合并语句,它们就不能共享同一个CTE。我的建议是使用您的CTE查询来填充表变量。然后,您可以在两个合并语句中使用相同的表变量。