2010-12-28 4 views
5

Ich füge Features zu einem vorhandenen ASP.NET-Projekt hinzu. Der Code ruft eine gespeicherte Prozedur auf, um einer bestimmten Tabelle eine Zeile hinzuzufügen. Ich brauche die Option, auch einer der Spalten mehrere Werte zu geben. In diesem Fall würde für jeden Wert in dieser Spalte eine Zeile hinzugefügt werden.Die beste Möglichkeit zum Einfügen mehrerer Zeilen (ADO.NET)

Ich weiß, dass ich meine Insert-Methode für jede Zeile einmal aufrufen kann, aber das klingt schrecklich ineffizient. Ich weiß, dass ich mehrere durch Semikolons getrennte Zeilen schreiben und sie in einer Anfrage an die Datenbank senden könnte. Aber der existierende Code ruft eine gespeicherte Prozedur auf und daher würden mehrere insert-Anweisungen erfordern, dass ich den alten Code modifiziere.

Beachten Sie, dass die mehrfachen Werte als mehrere Zeilen in einem Textfeld gespeichert werden, eine Zeile pro Wert und offensichtlich überprüft werden muss, ob sie korrekt eingegeben wurden.

Gibt es einen einfacheren Weg, dies zu erreichen?

+0

+1 - Ich bin auch an der Antwort auf diese Frage interessiert –

+0

Welche Version von SQL Server bitte? Die Antwort kann von 2000 bis 2005 bis 2008 abweichen ... – gbn

+0

Ich bin nicht 100% klar, was sie auf dem Server verwenden werden. Also würde ich wahrscheinlich nichts bestimmtes zielen wollen, das nach 2005 kam. –

Antwort

2

SQL Server 2008 hat die "Tabellentyp" -Parameter, die mehrere Zeilen als Parameter zulassen. Ein Beispiel ist definiert in this SO question

SQL Server 2005+ hat eine gute XML-Handhabung. Wir verwenden dies derzeit für kleine Datensätze. SQL Server 2000 XML-Behandlung ist nicht so schön.

Für alle Versionen können Sie eine temporäre Tabelle erstellen und dann eine gespeicherte Prozedur aufrufen, die diese Tabelle verwendet. Sie können SQLBulkCopy verwenden, um die Tabelle zu laden. Nützlich für viele Zeilen.

Im Allgemeinen ist das Problem ein allgemeines. Erland Sommarskog hat einen Artikel "Arrays and Lists in SQL Server 2005 and Beyond", der einer der definitiven Artikel zu diesem Thema ist (er hat mehr).

Zusammenfassung:

  • Tabellentyp (SQL Server 2008+)
  • XML (einfacher mit SQL Server 2005+)
  • temporäre Tabelle (alle Versionen)
+0

Interessant. Könnte ein bisschen mehr sein, als ich gerade jetzt springen möchte. –

0

Was ist so etwas wie dieses:

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 

Stolen aus here.

Wenn Sie SQL Server 2008 verwenden, können Sie diese Methode verwenden:

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

nicht sicher, wie Sie dies mit einem gespeicherten proc durch arbeiten könnte ...

+0

Danke, aber ich sehe nicht, dass dies mit einer gespeicherten Prozedur kompatibel ist. Der obige Code weiß voraus, wie viele Werte einzufügen sind und daher auf der Client-Seite ausgeführt werden müssen. –

+0

Ich glaube nicht, dass Sie mit einem gespeicherten Proc das tun können, was Sie wollen, es sei denn, Sie machen 'EXEC sp_MyProc' immer wieder. Sie müssen die Anzahl der Einfügungen nicht kennen, die ausgeführt werden, um die obige Methode zu verwenden, wenn Sie eine Schleife verwenden, um die SQL-Anweisung zu erstellen, die ausgeführt wird. Wenn Sie eine Schleife verwenden, um die SQL-Anweisung zu erstellen, seien Sie sehr vorsichtig, dass Sie sich SQL Injection nicht offen lassen. –

0

Ich landete Senden einer Zeichenfolge mit Trennzeichen als eines der Argumente der gespeicherten Prozedur und dann Analysieren jedes Elements aus der Zeichenfolge und Hinzufügen einer Zeile für jede.

Ich bin mir nicht sicher, ob dies der beste Weg ist, um dies zu erreichen, aber es brauchte nicht viel Überarbeitung bestehender Code und scheint, dass es ziemlich effizient für mich sein sollte.

+0

Das ist eigentlich in meinem Artikel Link beschrieben – gbn

+0

Mindestens einer dieser Artikel war extrem lang. Könntest du etwas genauer sagen, über welchen Link? Vielen Dank. –

+0

"Arrays und Listen in SQL Server 2005 und darüber hinaus". Es ist lang, weil es ein komplexes Thema ist – gbn

0

Schauen Sie sich SqlBulkCopy an, es ermöglicht Ihnen, Ihre Daten direkt in die Datenbank einzugeben.