Comment puis-je insérer plusieurs lignes sans répéter le "INSERT INTO dbo.Bla" la partie de la déclaration?

je sais que je l'ai fait avant il y a des années, mais je ne me souviens pas de la syntaxe, et je ne peux pas le trouver n'importe où en raison de tirer vers le haut des tonnes de Docs d'AIDE et des articles au sujet des"importations en vrac".

voici ce que je veux faire, mais la syntaxe n'est pas exactement correcte... s'il vous plaît, quelqu'un qui a fait cela avant, de m'aider :)

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

je sais que c'est fermer à la bonne syntaxe. Je pourrais avoir besoin du mot "vrac" là-dedans, ou quelque chose, je ne me souviens pas. Une idée?

j'en ai besoin 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 suis Incorrect syntax near the keyword 'VALUES'.

455
demandé sur Robert Harvey 2010-04-12 23:18:48

13 réponses

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

pour SQL Server 2008, peut le faire dans une clause de valeurs exactement selon l'énoncé de votre question (vous avez juste besoin d'ajouter une virgule pour séparer chaque énoncé de valeurs)...

290
répondu gbn 2017-04-27 13:05:00

votre syntaxe fonctionne presque dans SQL Server 2008 (mais pas dans 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 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 je pense qu'elle est toujours pertinente.

441
répondu Daniel Vassallo 2016-05-03 14:11:19

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 avez besoin de code dur les données puis SQL 2008 et les versions suivantes vous permettent de faire ce qui suit...

INSERT INTO MyTable (Name, ID)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
211
répondu George 2013-04-30 22:22:54

on pourrait faire ça (moche mais ça fonctionne):

INSERT INTO dbo.MyTable (ID, Name) 
select * from
(
 select 123, 'Timmy'
  union all
 select 124, 'Jonny' 
  union all
 select 125, 'Sally'
 ...
) x
13
répondu davek 2010-04-12 19:23:15

utilisant la syntaxe INSERT INTO ... VALUES comme dans réponse de Daniel Vassallo il y a une limite gênante:

de MSDN

le nombre maximum de lignes qui peuvent être construites en insérant des lignes directement dans la liste des valeurs est 1000

la façon la plus facile d'omettre cette limitation est d'utiliser une table dérivée comme:

INSERT INTO dbo.Mytable(ID, Name)
SELECT ID, Name 
FROM (
   VALUES (1, 'a'),
          (2, 'b'),
          --...
          -- more than 1000 rows
)sub (ID, Name);

LiveDemo


cela fonctionnera à partir de SQL Server 2008+
13
répondu Lukasz Szozda 2018-05-08 14:20:16

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
répondu Cade Roux 2010-04-12 19:24:30

cela semble correct pour SQL Server 2008. Pour SS2005 & earlier, vous devez répéter l'énoncé des valeurs.

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
répondu DaveE 2010-04-13 17:21:28

il serait plus facile D'utiliser XML dans SQL Server pour insérer plusieurs lignes sinon cela devient très fastidieux.

lire 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 dans sql server pour voir un échantillon.

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
répondu Joe 2011-12-02 00:16:20
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 UNE AUTRE FAÇON

INSERT INTO MyTable (FirstCol, SecondCol)
VALUES 
('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
6
répondu gngolakia 2011-12-02 07:36:27

j'ai utilisé le suivant:

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

il ajoutera dix lignes avec des GUIDs uniques pour L'ID et le nom.

Note: ne terminez pas la dernière ligne (GO 10) avec ';' parce qu'elle va lancer une erreur: une erreur fatale de script s'est produite. Une syntaxe incorrecte a été rencontrée lors de L'analyse de GO.

6
répondu valentinvs 2016-03-28 13:04:30

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

5
répondu abatishchev 2010-04-13 17:33:15

cela fonctionne très vite,et efficace 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'énoncé 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 # 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
répondu Charan Ghate 2016-03-19 21:31:20

cela permettra d'obtenir 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 d'un autre tableau :

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

Ou même à partir 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
0
répondu Tigerjz32 2018-09-18 17:08:04