it-swarm.com.de

Wie füge ich mehrere Zeilen ein, OHNE den Teil "INSERT INTO dbo.Blah" der Anweisung zu wiederholen?

Ich weiß, dass ich das schon vor Jahren getan habe, aber ich kann mich nicht an die Syntax erinnern und kann sie nirgendwo finden, weil ich Unmengen von Hilfedokumenten und Artikeln über "Massenimporte" abgerufen habe.

Hier ist, was ich tun möchte, aber die Syntax ist nicht genau richtig ... Bitte, jemand, der dies zuvor getan hat, hilft mir :)

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

Ich weiß, dass dies nahe an der richtigen Syntax liegt. Vielleicht brauche ich das Wort "BULK" oder etwas, an das ich mich nicht erinnern kann. Irgendeine Idee?

Ich brauche dies für eine SQL Server 2005-Datenbank. Ich habe diesen Code ausprobiert, ohne Erfolg:

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

Ich bekomme 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'

Für SQL Server 2008 können Sie dies in einer VALUES-Klausel tun gena gemäß der Anweisung in Ihrer Frage (Sie müssen nur ein Komma hinzufügen, um jede Werteanweisung zu trennen) ...

318
gbn

Ihre Syntax funktioniert fast in SQL Server 2008 (jedoch nicht in 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 Als die Frage beantwortet wurde, wurde nicht ersichtlich, dass sich die Frage auf SQL Server 2005 bezog. Ich lasse diese Antwort hier, da ich glaube, dass sie immer noch relevant ist.

490
Daniel Vassallo

Wenn sich Ihre Daten bereits in Ihrer Datenbank befinden, haben Sie folgende Möglichkeiten:

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

Wenn Sie die Daten hart codieren müssen, können Sie mit SQL 2008 und späteren Versionen Folgendes tun ...

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

Sie könnten dies tun (hässlich, aber es funktioniert):

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

Sie können eine Union verwenden:

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

Dies sieht für SQL Server 2008 in Ordnung aus. Für SS2005 und frühere Versionen müssen Sie die VALUES-Anweisung wiederholen.

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

EDIT :: Mein schlechtes. Sie müssen das 'INSERT INTO' für jede Zeile in SS2005 wiederholen.

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

Ich habe folgendes benutzt:

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

Es werden zehn Zeilen mit eindeutigen GUIDs für ID und Name hinzugefügt.

Hinweis: Beenden Sie die letzte Zeile (GO 10) nicht mit ';' weil es Fehler auslöst: Ein schwerwiegender Skriptfehler ist aufgetreten. Beim Analysieren von GO wurde eine falsche Syntax festgestellt.

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

ODER SIE KÖNNEN EINEN ANDEREN WEG VERWENDEN

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

Es wäre einfacher, XML in SQL Server zum Einfügen mehrerer Zeilen zu verwenden, da dies sonst sehr mühsam wird.

Den vollständigen Artikel mit Code-Erklärungen finden Sie hier http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

Kopieren Sie den folgenden Code in den SQL Server, um ein Beispiel anzuzeigen.

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

Entsprechend INSERT (Transact-SQL) (SQL Server 2005) können Sie INSERT INTO dbo.Blah nicht auslassen und müssen es jedes Mal angeben oder eine andere Syntax/Methode verwenden.

5
abatishchev

Dies wird das erreichen, wonach Sie fragen:

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

Für zukünftige Entwickler können Sie auch aus einer anderen Tabelle einfügen:

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

Oder sogar aus mehreren Tabellen:

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

Dies funktioniert in SQL sehr schnell und effizient. Angenommen, Sie haben die Tabelle 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
)

Sie können also mit der folgenden Abfrage nicht mehrere Datensätze in diese Tabelle einfügen, ohne die Anweisung insert zu wiederholen.

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)

Auch mit C # mit SqlBulkCopy bulkcopy = new SqlBulkCopy(con)

Sie können jeweils 10 Zeilen einfügen

   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