zig*_*zig 5 sql-server common-table-expression
我可以在 SQL Sever 中使用多个 CTE INSERT 表达式吗?
PostgreSQL 中允许这样做:
例如在 PostgreSQL 中。
with foo as
(
select * from ...
),
b as
(
insert into bar
select * from foo
returning *
)
insert into baz
select * from foo;
Run Code Online (Sandbox Code Playgroud)
我在 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
Run Code Online (Sandbox Code Playgroud)
上面的方法不起作用。
对于您的情况,我会考虑trigger
在 MS SQL Server 中使用(加上inserted
它可以访问的临时表) - 可以在此处找到更多信息。另一个有用的链接在这里。
我解决你的问题的方法是将其视为两个独立的代码块:
Run Code Online (Sandbox Code Playgroud);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
Run Code Online (Sandbox Code Playgroud)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
您必须首先更新查询以匹配列名称/表名称/触发器名称等。