web-dev-qa-db-fra.com

Comment insérer plusieurs lignes SANS répéter la partie "INSERT INTO dbo.Blah" de la déclaration?

Je sais que cela a déjà été fait il y a des années, mais je ne me souviens pas de la syntaxe, et je ne la trouve nulle part en raison de l'extraction de tonnes de documents d'aide et d'articles sur les "importations en bloc".

Voici ce que je veux faire, mais la syntaxe n'est pas tout à fait correcte ... S'il vous plaît, quelqu'un qui a déjà fait cela auparavant, aidez-moi :)

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

Je sais que c'est fermer à la bonne syntaxe. J'ai peut-être besoin de la parole "VRAC", ou de quelque chose dont je ne me souviens plus. Une idée?

J'ai besoin de cela pour une base de données SQL Server 2005. J'ai essayé ce code, en vain:

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

Je reçois Incorrect syntax near the keyword 'VALUES'.

507
Timothy Khouri
INSERT INTO dbo.MyTable (ID, Name)
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'

Pour SQL Server 2008, vous pouvez le faire dans une clause VALUES exactement conformément à la déclaration de votre question (il vous suffit d'ajouter une virgule pour séparer chaque déclaration de valeurs) ...

318
gbn

Votre syntaxe fonctionne presque dans SQL Server 2008 (mais pas dans SQL Server 20051):

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 Lorsqu’on a répondu à la question, il n’était pas évident que la question faisait référence à SQL Server 2005. Je laisse cette réponse ici, car j’estime qu’elle est toujours pertinente.

490
Daniel Vassallo

Si vos données sont déjà dans votre base de données, vous pouvez faire:

INSERT INTO MyTable(ID, Name)
SELECT ID, NAME FROM OtherTable

Si vous devez coder les données en dur, SQL 2008 et les versions ultérieures vous permettent de procéder comme suit ...

INSERT INTO MyTable (Name, ID)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
230
George

Vous pouvez faire ceci (moche mais ça marche):

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

Vous pouvez utiliser un syndicat:

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)
8
Cade Roux

Cela semble correct pour SQL Server 2008. Pour SS2005 et versions antérieures, vous devez répéter l'instruction VALUES.

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

EDIT :: My bad. Vous devez répéter le "INSERT INTO" pour chaque ligne dans 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')  
6
DaveE

J'ai utilisé les éléments suivants:

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

Il ajoutera dix lignes avec des GUID uniques pour l'ID et le nom.

Remarque: ne mettez pas fin à la dernière ligne (GO 10) avec ';' car il va générer une erreur: Une erreur de script fatale s'est produite. Une syntaxe incorrecte a été rencontrée lors de l'analyse de GO.

6
valentinvs
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 vous pouvez utiliser un autre moyen

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

Il serait plus facile d’utiliser XML dans SQL Server pour insérer plusieurs lignes, sinon cela deviendrait très fastidieux.

Voir l'article complet avec les explications du code ici http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

Copiez le code suivant sur le serveur SQL pour afficher un exemple.

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)
6
Joe

Correspondant à INSERT (Transact-SQL) (SQL Server 2005), vous ne pouvez pas omettre INSERT INTO dbo.Blah et vous devez le spécifier à chaque fois ou utiliser une autre syntaxe/approche,

5
abatishchev

Cela permettra de réaliser ce que vous demandez:

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

Pour les futurs développeurs, vous pouvez aussi insérer depuis une autre table:

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

Ou même de plusieurs tables:

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

Cela fonctionne très rapidement et efficacement en SQL. Supposons que vous ayez la Table Sample with 4 column a,b,c,d where a,b,d are int and c column is Varchar(50).

CREATE TABLE [dbo].[Sample](
[a] [int] NULL,
[b] [int] NULL,
[c] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[D] [int] NULL
)

Donc, vous ne pouvez pas insérer plusieurs enregistrements dans cette table en utilisant la requête suivante sans répéter l’instruction d’insertion,

DECLARE @LIST VARCHAR(MAX)
SET @LIST='SELECT 1, 1, ''Charan Ghate'',11
     SELECT 2,2, ''Mahesh More'',12
     SELECT 3,3,''Mahesh Nikam'',13
     SELECT 4,4, ''Jay Kadam'',14'
INSERT SAMPLE (a, b, c,d) EXEC(@LIST)

Aussi avec C # en utilisant SqlBulkCopy bulkcopy = new SqlBulkCopy(con)

Vous pouvez insérer 10 lignes à la fois

   DataTable dt = new DataTable();
        dt.Columns.Add("a");
        dt.Columns.Add("b");
        dt.Columns.Add("c");
        dt.Columns.Add("d");
        for (int i = 0; i < 10; i++)
        {
            DataRow dr = dt.NewRow();
            dr["a"] = 1;
            dr["b"] = 2;
            dr["c"] = "Charan";
            dr["d"] = 4;
            dt.Rows.Add(dr);
        }
        SqlConnection con = new SqlConnection("Connection String");
        using (SqlBulkCopy bulkcopy = new SqlBulkCopy(con))
        {
            con.Open();
            bulkcopy.DestinationTableName = "Sample";
            bulkcopy.WriteToServer(dt);
            con.Close();
        }
2
Charan Ghate