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