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


Je sais que je l'ai fait il y a quelques années, mais je ne me souviens pas de la syntaxe, et je ne la trouve nulle part parce que je trouve des tonnes de documents d'aide et d'articles sur les «importations en vrac».

Voici ce que je veux faire, mais la syntaxe n'est pas exactement exacte ... s'il vous plaît, quelqu'un qui a déjà fait ça, aidez-moi :)

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 "BULK" là-dedans, ou de quelque chose, 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 suis en train Incorrect syntax near the keyword 'VALUES'.


446
2018-04-12 19:18


origine


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, vous pouvez le faire dans une clause VALUES exactement selon l'énoncé de votre question (il suffit d'ajouter une virgule pour séparer chaque énoncé de valeurs) ...


288
2018-04-12 19:23



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 Quand la question a été répondue, il n'était pas évident que la question faisait référence à SQL Server 2005. Je laisse cette réponse ici, car je crois que c'est toujours pertinent.


426
2018-04-12 19:23



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

209
2018-04-12 19:23



Vous pouvez le faire (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
2018-04-12 19:23



En utilisant INSERT INTO ... VALUES syntaxe comme dans Daniel Vassallo répondre il y a une limitation ennuyeuse:

De MSDN

Le nombre maximal de lignes pouvant être construites en insérant des lignes directement dans la liste VALUES est 1000

La manière la plus simple d'omettre cette limitation est d'utiliser une table dérivée telle que:

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+


10
2018-03-09 19:11



Vous pouvez utiliser une union:

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
2018-04-12 19:24



Cela semble correct pour SQL Server 2008. Pour SS2005 et les 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')  

MODIFIER:: Ma faute. Vous devez répéter le 'INSERT INTO' pour chaque ligne de 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
2018-04-12 19:25



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

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

Copiez le code suivant dans 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
2017-12-01 21:55



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 MANIÈRE

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

6
2017-12-02 07:36



J'ai utilisé ce qui suit:

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

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

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


6
2018-03-28 13:04



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


5
2018-04-13 17:33