sql-server - script - t-sql insert into




Wie füge ich mehrere Zeilen ohne den "INSERT INTO dbo.Blah" Teil der Anweisung zu wiederholen? (8)

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

Daher können Sie mehrere Datensätze in dieser Tabelle nicht einfügen, indem Sie die folgende Abfrage verwenden, ohne die INSERT-Anweisung 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();
        }

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

Hier ist, was ich tun möchte, aber die Syntax ist nicht genau richtig ... bitte, jemand, der das schon einmal gemacht hat, hilf mir :)

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

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

Ich brauche das für eine SQL Server 2005-Datenbank. Ich habe diesen Code vergeblich versucht:

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 eine Incorrect syntax near the keyword 'VALUES'.


Dies sieht für SQL Server 2008 OK aus. Für SS2005 und früher 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')  

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 / Vorgehensweise verwenden,


Es wäre einfacher, XML in SQL Server zu verwenden, um mehrere Zeilen einzufügen, andernfalls wird es sehr mühsam.

Sehen Sie den vollständigen Artikel mit Code-Erklärungen 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)

Ihre Syntax funktioniert fast in SQL Server 2008 (aber 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 Bei der Beantwortung der Frage wurde nicht klargestellt, dass sich die Frage auf SQL Server 2005 bezieht. Ich lasse diese Antwort hier, da ich glaube, dass sie immer noch relevant ist.


Mit INSERT INTO ... VALUES Syntax wie in Daniel Vassallos Antwort gibt es eine lästige Einschränkung:

Von MSDN

Die maximale Anzahl der Zeilen, die durch direktes Einfügen von Zeilen in die VALUES-Liste erstellt werden können, beträgt 1000

Die einfachste Möglichkeit, diese Einschränkung zu umgehen, ist die Verwendung einer abgeleiteten Tabelle wie:

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

LiveDemo

Dies funktioniert von SQL Server 2008+


Wenn sich Ihre Daten bereits in Ihrer Datenbank befinden, können Sie Folgendes tun:

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)

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 genau wie in der Anweisung in Ihrer Frage tun (Sie müssen nur ein Komma hinzufügen, um jede Werteanweisung zu trennen) ...





insert