我正在尝试使用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;
答案 0 :(得分:4)
是否可以使用合并更新2个表?
不,无法使用单个合并更新两个表。你必须做两个单独的合并声明。
正如其他人在评论中指出的那样,单个CTE只能用于一个语句,所以如果你做两个合并语句,它们就不能共享同一个CTE。我的建议是使用您的CTE查询来填充表变量。然后,您可以在两个合并语句中使用相同的表变量。