webentwicklung-frage-antwort-db.com.de

SQL Server 2005: Fügen Sie mehrere Zeilen mit einer einzelnen Abfrage ein

Dies sollte eine ziemlich einfache Frage sein, aber ich konnte keine solide Antwort online finden. Ich versuche, mehrere Zeilen in dieselbe Tabelle einzufügen, jedoch nur mit einer Anweisung. Die populärsten, die ich online gesehen habe, ist die folgende, aber ich habe gelesen, dass sie nur mit SQL Server 2008 funktioniert:

INSERT INTO Table (Name, Location) VALUES
('Name1', 'Location1'),
('Name2', 'Location2'),
('Name3', 'Location3'), etc...

Ich würde diese Methode vorziehen, wenn sie mit SQL Server 2005 funktioniert, aber ich glaube nicht, dass dies der Fall ist. Die andere Option, die ich gelesen habe, hat mit den folgenden SELECT-Anweisungen von UNION ALL nach dem INSERT zu tun, was klobig erscheint. Weiß jemand mit Sicherheit die beste Syntax, um dies 2005 zu tun?

Vielen Dank.

16
MegaMatt

Ja. Sie müssen UNION ALLs in SQL Server 2005 verwenden, um mehrere Zeilen in ein SQL-Skript in einer einzigen Anweisung einzufügen.

INSERT INTO Table 
  (Name, Location) 
SELECT 'Name1', 'Location1' 
UNION ALL
SELECT 'Name2', 'Location2'
UNION ALL
SELECT 'Name3', 'Location3' 

Die andere Hauptalternative besteht darin, die Insert-Anweisung mehrmals zu wiederholen, was noch ausführlicher ist. Sie müssen vorsichtig sein, explizite Transaktionen in diesem letzten Fall zu verwenden, um den Aufwand vieler einzelner Commits zu vermeiden (und natürlich aus Gründen der Atomizität).

Wenn Sie viele Zeilen zum Einfügen haben, können Sie BULK INSERT verwenden, um alles aus einer begrenzten Datei in einer Anweisung zu laden.

Wenn dies Daten sind, die sich bereits in der Datenbank befinden und die Sie auf einem anderen Server implementieren möchten, verfügt das SSMS Tools Pack addin über eine Funktion zum Generieren von Einfügeanweisungen, die diese Anweisungen für Sie generieren kann.

21
Martin Smith

Wie andere schon gesagt haben, ist der Schlüssel hier UNION ALL. Für mich hält ein CTE die Dinge ein wenig sauberer, z.

WITH NewStuff (Name, Location)
     AS
     (
      SELECT 'Name1', 'Location1' UNION ALL
      SELECT 'Name2', 'Location2' UNION ALL
      SELECT 'Name3', 'Location3' 
     )
INSERT INTO Stuff (Name, Location) 
SELECT Name, Location
  FROM NewStuff; 
5
onedaywhen

Sie müssen union all in SQL Server 2005 verwenden. Um ehrlich zu sein, das ist so klobig und hässlich, ich würde einfach mehrere inserts verwenden, wenn ich Sie wäre. Verpacken Sie sie in einer einzigen Transaktion und am Ende ist es dasselbe.

3
Donnie

Ja, dies sind Ihre einzigen Optionen, sofern Sie nicht viele Daten einfügen und einen BULK INSERT untersuchen möchten

INSERT INTO Table (Name, Location)
SELECT 'Name1', 'Location1' UNION ALL
SELECT 'Name2', 'Location2' UNION ALL
SELECT 'Name3', 'Location3' 
1
Chris Diver

Da MS SQLServer 2005 XML unterstützt, empfehle ich die Methode STORED PROCEDURE mit einem Eingabeparameter vom XML-Typ. Wenn Sie mit .NET arbeiten, können Sie DataSet mit der Methode ds.GetXml () leicht in eine XML-Zeichenfolge konvertieren und an den SP senden

CREATE PROCEDURE [dbo].[insertLocation](@XML XML=NULL)
AS
BEGIN
  INSERT INTO [dbo].[TheLocations]
        ( [Name], [Location] )
   SELECT
        XTab.value('Name[1]','nvarchar(100)') AS[Name],
        XTab.value('Location[1]','nvarchar(200)') AS[Location]
    FROM @XML.nodes('TheLocations') XTab([XTab])
END
0
Appyks