具有多个插入语句的 SQL Server CTE

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)

上面的方法不起作用。

MTa*_*Tay 0

对于您的情况,我会考虑trigger在 MS SQL Server 中使用(加上inserted它可以访问的临时表) - 可以在此处找到更多信息。另一个有用的链接在这里

我解决你的问题的方法是将其视为两个独立的代码块:

  • 第一个块(从两个 CTE 运行第一个插入语句):
;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)
  • 第二个块(Baz1 表中存在的触发器,在插入表后运行):
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
Run Code Online (Sandbox Code Playgroud)

您必须首先更新查询以匹配列名称/表名称/触发器名称等。