【发布时间】:2011-09-11 04:33:12
【问题描述】:
为什么这是合法的:
DECLARE @Party TABLE
(
PartyID nvarchar(10)
)
INSERT INTO @Party
SELECT Name FROM
(INSERT INTO SomeOtherTable
OUTPUT inserted.Name
VALUES ('hello')) [H]
SELECT * FROM @Party
但是下一个块给了我一个错误:
WITH Hey (Name)
AS (
SELECT Name FROM
(INSERT INTO SomeOtherTable
OUTPUT inserted.Name
VALUES ('hello')) [H]
)
SELECT * FROM Hey
第二个块给我错误“在不是 INSERT 语句的直接行源的 SELECT 语句中不允许嵌套的 INSERT、UPDATE、DELETE 或 MERGE 语句。
似乎是说允许嵌套的 INSERT 语句,但在我的 CTE 案例中,我没有嵌套在另一个 INSERT 中。我对这个限制感到惊讶。我的 CTE 案例有什么变通办法吗?
【问题讨论】:
-
错误信息对我来说似乎很清楚。不允许像这样将插入语句嵌套在
SELECT中。如果允许,那么如果您执行SELECT TOP 10 * FROM Hey CROSS JOIN SomeOtherTable会执行 10 次插入,您会发生什么? -
你有这样做的理由吗?还是只是实验?
-
事实上,您的(无效)CTE 示例仅相当于
INSERT INTO SomeOtherTable OUTPUT inserted.Name VALUES ('Hello')。
标签: sql-server tsql sql-server-2008 common-table-expression