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

the*_*ote 2 t-sql sql-server merge stored-procedures

我正在尝试使用一个MERGE语句来使用单个源 (CTE) 更新 2 个表。当我只使用 1 个合并时它有效,但是当我添加第二个时,它返回一个错误:

消息 208,级别 16,状态 1,过程 mn_SeoUrl_UpdateBulk,第 46 行
无效的对象名称“ cte ”。

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

任何帮助深表感谢。

谢谢你。

这是我的失败代码(错误的列名):

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;
Run Code Online (Sandbox Code Playgroud)

Tab*_*man 5

是否可以通过合并更新 2 个表?

不,不可能通过一次合并更新两个表。您必须执行两个单独的合并语句。

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