Eu tenho uma tabela chamada dbo.Groups
definida assim:
CREATE TABLE dbo.Groups
(
GroupID int NOT NULL IDENTITY (1,1) PRIMARY KEY
);
A tabela realmente consiste em apenas uma IDENTITY
coluna.
Às vezes, quero inserir várias linhas de uma só vez e obter os IDs gerados. (Já tenho uma variável de tabela pré-definida chamada @output
com uma única ID
coluna para ser usada na OUTPUT
cláusula.)
Agora eu sei como eu procederia se fosse uma única linha:
INSERT INTO
dbo.GroupID
OUTPUT
inserted.GroupID INTO @output (ID)
DEFAULT VALUES
;
Mas eu quero ser capaz de inserir dois ou mais de uma só vez. O número real é determinado pelo número de linhas retornadas por esta consulta:
SELECT
*
FROM
dbo.MySource
;
Portanto, se a consulta retornar uma linha, quero inserir uma linha dbo.Groups
e retornar o arquivo GroupID
. Se for cem linhas, eu esperaria cem linhas inseridas e cem IDs gerados e retornados de uma só vez.
Um método óbvio é inserir uma linha de cada vez em um loop. Eu gostaria de evitar isso e usar uma abordagem baseada em conjuntos, algo na linha de
INSERT INTO
dbo.GroupID
OUTPUT
inserted.GroupID INTO @output (ID)
SELECT
... -- what?
FROM
dbo.MySource
;
Existe uma maneira de inserir várias linhas em uma tabela com apenas uma IDENTITY
coluna em (de preferência) uma única instrução?
No momento em que escrevo isso, não há como inserir várias linhas em apenas uma
IDENTITY
coluna usando umaINSERT
instrução. ODEFAULT VALUES
espaço reservado representa apenas uma linha. E aINSERT ... SELECT
sintaxe não tem extensão para suportar a mesma funcionalidade que aDEFAULT VALUES
cláusula.Em vez disso, você pode usar uma
MERGE
declaração para atingir a meta:A
ON 1 = 0
cláusula basicamente transforma oMERGE
em um pureINSERT
, porque a condição explicitamente falsa faz com que todas as linhas de origem não sejam correspondidas e, assim, acione aWHEN NOT MATCHED THEN
ramificação da instrução. Agora, aWHEN NOT MATCHED THEN
ramificação espera uma definição de inserção de linha única, onde o familiarDEFAULT VALUES
é perfeitamente válido. Como resultado, você obtém efetivamente umaINSERT ... SELECT
instrução com a funcionalidade deINSERT ... DEFAULT VALUES
para um número arbitrário de linhas.