我有一个dbo.Groups
这样定义的表:
CREATE TABLE dbo.Groups
(
GroupID int NOT NULL IDENTITY (1,1) PRIMARY KEY
);
该表实际上只包含一IDENTITY
列。
有时我想一次插入多行并获取生成的 ID。(我已经有一个预定义的表变量,在子句中使用@output
单个ID
列调用。)OUTPUT
现在我知道如果它是单行我将如何进行:
INSERT INTO
dbo.GroupID
OUTPUT
inserted.GroupID INTO @output (ID)
DEFAULT VALUES
;
但我希望能够一次插入两个或更多。实际数量取决于此查询返回的行数:
SELECT
*
FROM
dbo.MySource
;
因此,如果查询返回一行,我想插入一行dbo.Groups
并返回生成的GroupID
. 如果它是一百行,那么我预计会插入一百行,并立即生成和返回一百个 ID。
一种明显的方法是在循环中一次插入一行。我想避免这种情况,而是使用基于集合的方法,类似于
INSERT INTO
dbo.GroupID
OUTPUT
inserted.GroupID INTO @output (ID)
SELECT
... -- what?
FROM
dbo.MySource
;
有没有办法将多行插入到一个表中,而表中只有一个IDENTITY
列(最好是)一个语句?
在撰写本文时,无法
IDENTITY
使用INSERT
语句将多行插入到一列中。DEFAULT VALUES
占位符仅代表一行。并且语法没有扩展来支持与子句INSERT ... SELECT
相同的功能。DEFAULT VALUES
相反,您可以使用
MERGE
语句来实现目标:该
ON 1 = 0
子句基本上将 theMERGE
变成了 pureINSERT
,因为显式 false 条件导致所有源行不匹配,从而触发WHEN NOT MATCHED THEN
语句的分支。现在,WHEN NOT MATCHED THEN
分支需要一个单行插入定义,熟悉的地方DEFAULT VALUES
是完全有效的。结果,您有效地获得了具有任意行数INSERT ... SELECT
功能的语句。INSERT ... DEFAULT VALUES