我可以在SQL Sever中使用多个CTE INSERT表达式吗?
这在PostgreSQL中是允许的:
writeable common table expression and multiple insert statements
例如在PostgreSQL中。
with foo as
(
select * from ...
),
b as
(
insert into bar
select * from foo
returning *
)
insert into baz
select * from foo;
我在SQL Server中尝试过:
;WITH cte1 AS
(
SELECT * FROM Foo
),
cte2 AS ( -- depends on cte1
SELECT * FROM Bar WHERE ID IN (SELECT ID FROM cte1)
),
cte3 AS ( -- first insert
INSERT INTO Baz1
OUTPUT INSERTED.*
SELECT * FROM cte2
)
INSERT INTO Baz2 -- second insert depends on ct3 data-set
SELECT * FROM cte3
以上不起作用。
答案 0 :(得分:0)
对于您的情况,我会考虑在MS SQL Server中使用trigger
(以及它可以访问的inserted
临时表)-可以找到更多信息{{3 }}。另一个有用的链接here。
我如何处理您的问题是将其视为两个单独的代码块:
;WITH cte1 AS ( SELECT * FROM Foo ), cte2 AS ( -- depends on cte1 SELECT * FROM Bar WHERE ID IN (SELECT ID FROM cte1) ) INSERT INTO Baz1 SELECT * FROM cte2
CREATE TRIGGER [Some_unique_trigger_name] ON Baz1 AFTER INSERT AS BEGIN SET NOCOUNT ON; INSERT INTO Baz2( column_names ) SELECT * FROM inserted i END
您必须首先更新查询以使其与列名/表名/触发器名等匹配。