sql-server - table - w3schools insert sql




Como faço para inserir várias linhas sem repetir a parte "INSERT INTO dbo.Blah" da instrução? (9)

Eu sei que fiz isso antes de anos atrás, mas não me lembro da sintaxe, e não consigo encontrá-la em nenhum lugar devido à retirada de toneladas de documentos de ajuda e artigos sobre "importações em massa".

Aqui está o que eu quero fazer, mas a sintaxe não está exatamente certa ... por favor, alguém que tenha feito isso antes, me ajude :)

INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy'),
    (124, 'Jonny'),
    (125, 'Sally')

Eu sei que isto está perto da sintaxe certa. Eu posso precisar da palavra "BULK" lá, ou algo que eu não consigo lembrar. Qualquer ideia?

Eu preciso disso para um banco de dados do SQL Server 2005. Eu tentei este código, sem sucesso:

DECLARE @blah TABLE
(
    ID INT NOT NULL PRIMARY KEY,
    Name VARCHAR(100) NOT NULL
)

INSERT INTO @blah (ID, Name)
    VALUES (123, 'Timmy')
    VALUES (124, 'Jonny')
    VALUES (125, 'Sally')

SELECT * FROM @blah

Estou recebendo a Incorrect syntax near the keyword 'VALUES'.


Correspondendo a INSERT (Transact-SQL) (SQL Server 2005) você não pode omitir INSERT INTO dbo.Blah e precisa especificá-lo toda vez ou usar outra sintaxe / abordagem,


Eu tenho usado o seguinte:

INSERT INTO [TableName] (ID, Name)
values (NEWID(), NEWID())
GO 10

Ele adicionará dez linhas com GUIDs exclusivos para ID e nome.

Nota: não termine a última linha (GO 10) com ';' porque isso causará erro: ocorreu um erro fatal de script. Sintaxe incorreta foi encontrada ao analisar GO.


Isso parece OK para o SQL Server 2008. Para o SS2005 e versões anteriores, você precisa repetir a instrução VALUES.

INSERT INTO dbo.MyTable (ID, Name)  
VALUES (123, 'Timmy')  
VALUES (124, 'Jonny')   
VALUES (125, 'Sally')  

EDITAR: Meu mal. Você tem que repetir o 'INSERT INTO' para cada linha no SS2005.

INSERT INTO dbo.MyTable (ID, Name)  
VALUES (123, 'Timmy')  
INSERT INTO dbo.MyTable (ID, Name)  
VALUES (124, 'Jonny')   
INSERT INTO dbo.MyTable (ID, Name)  
VALUES (125, 'Sally')  

Isso vai conseguir o que você está perguntando:

INSERT INTO table1 (ID, Name)
    VALUES (123, 'Timmy'), 
           (124, 'Jonny'), 
           (125, 'Sally');

Para futuros desenvolvedores, você também pode inserir de outra tabela :

INSERT INTO table1 (ID, Name)
    SELECT 
         ID, 
         Name 
    FROM table2

Ou até mesmo de várias tabelas :

INSERT INTO table1 (column2, column3)
    SELECT 
         t2.column, 
         t3.column
    FROM table2 t2
         INNER JOIN table3 t3
         ON t2.ID = t3.ID

Seria mais fácil usar XML no SQL Server para inserir várias linhas, caso contrário, ele se tornará muito tedioso.

Ver artigo completo com explicações de código aqui http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

Copie o seguinte código no sql server para visualizar uma amostra.

declare @test nvarchar(max)

set @test = '<topic><dialog id="1" answerId="41">
        <comment>comment 1</comment>
        </dialog>
    <dialog id="2" answerId="42" >
    <comment>comment 2</comment>
        </dialog>
    <dialog id="3" answerId="43" >
    <comment>comment 3</comment>
        </dialog>
    </topic>'

declare @testxml xml
set @testxml = cast(@test as xml)
declare @answerTemp Table(dialogid int, answerid int, comment varchar(1000))

insert @answerTemp
SELECT  ParamValues.ID.value('@id','int') ,
ParamValues.ID.value('@answerId','int') ,
ParamValues.ID.value('(comment)[1]','VARCHAR(1000)')
FROM @testxml.nodes('topic/dialog') as ParamValues(ID)

Sua sintaxe quase funciona no SQL Server 2008 (mas não no SQL Server 2005 1 ):

CREATE TABLE MyTable (id int, name char(10));

INSERT INTO MyTable (id, name) VALUES (1, 'Bob'), (2, 'Peter'), (3, 'Joe');

SELECT * FROM MyTable;

id |  name
---+---------
1  |  Bob       
2  |  Peter     
3  |  Joe       

1 Quando a questão foi respondida, não ficou evidente que a questão estava se referindo ao SQL Server 2005. Estou deixando esta resposta aqui, pois acredito que ainda seja relevante.


Você pode usar uma união:

INSERT INTO dbo.MyTable (ID, Name) 
SELECT ID, Name FROM (
    SELECT 123, 'Timmy'
    UNION ALL
    SELECT 124, 'Jonny'
    UNION ALL
    SELECT 125, 'Sally'
) AS X (ID, Name)

Você poderia fazer isso (feio mas funciona):

INSERT INTO dbo.MyTable (ID, Name) 
select * from
(
 select 123, 'Timmy'
  union all
 select 124, 'Jonny' 
  union all
 select 125, 'Sally'
 ...
) x

USE YourDB
GO
INSERT INTO MyTable (FirstCol, SecondCol)
SELECT 'First' ,1
UNION ALL
SELECT 'Second' ,2
UNION ALL
SELECT 'Third' ,3
UNION ALL
SELECT 'Fourth' ,4
UNION ALL
SELECT 'Fifth' ,5
GO

OU VOCÊ PODE USAR OUTRA MANEIRA

INSERT INTO MyTable (FirstCol, SecondCol)
VALUES 
('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)




insert