Löschen mehrerer Zeilen aus einer Tabelle in sql server mit einem einzigen Aufruf von der client-Anwendung

Hier ist meine Forderung:

  • Möchte ich löschen mehrerer Zeilen einer Tabelle
  • Ich habe die Liste aller ids, die gelöscht werden soll, in der client-app.
  • Alles was ich will ist nur ein einzigen Anruf von meinem C# - client-app zu löschen all diese Einträge.

Was ich vorher hatte:

foreach (var id in idList)

{

//Call a Stored Procedure which takes the id

//as parameter and deletes the record

}

Dies ist ein problem, weil es eine Datenbank hit für jedes Element in der Schleife.

Dann begann ich mit der SQL Server 2008 neu eingeführten Arten von Tabellen und Table-Valued Parameter für gespeicherte Prozeduren für diese.

  • Zuerst eine Tabelle Geben in der Datenbank erstellt, die eine einzelne Spalte (vom Typ Id)
  • Erstellen Sie eine neue Gespeicherte Prozedur, die annimmt, dieser neue Typ Tabelle (Table-Valued Parameters)
  • In den Client-code, erstellen Sie eine Liste/Datatable mit allen ids gelöscht werden.
  • Machen Sie einen einzigen Aufruf an die Datenbank zu nutzen, die neue gespeicherte Prozedur.

Es ist ziemlich straight-forward in der client-code, der geht ungefähr so:

SqlParameter parameter = new SqlParameter();

parameter.SqlDbType = System.Data.SqlDbType.Structured;

OK - Obwohl ich das erreicht, was ich für dieses definitiv nicht für SQL server-Versionen vor 2008.

Also, was ich Tat, war die Einführung eines fall-back-Mechanismus:

  • Ich führte eine Gespeicherte Prozedur, die dauert Komma-separierte id-Werte
  • Mein client-code zu schaffen, wie durch Komma getrennte ids, und dann einfach übergeben es an die neue gespeicherte Prozedur.
  • Die Gespeicherte Prozedur wird dann split all jene ids, und rufen Sie dann löschen Sie eins nach dem anderen.
  • So, ich habe erreicht, was ich gesetzt hatten, auch auf SQL Server-version vor 2008: löschen mehrere Zeilen mit einer einzigen Datenbank-Treffer.

Aber ich bin nicht davon überzeugt, dass mit dem letzten Ansatz, den ich nahm - Eine schnelle Suche über das internet nicht offenbaren etwas viel.

Also kann jemand mir sagen, ob ich das richtige mache mit Komma getrennte ids und alle.

Was ist die übliche best-practice-löschen mehrerer Datensätze aus der client-app mit einer einzigen Datenbank-Treffer, vorausgesetzt, die ids sind bekannt.

Vielen Dank im Voraus.

  • Was macht der delete-Anweisung Aussehen?
  • delete from tableName where id=@rowId. Die @rowId ist eine ganze Zahl, die nach der BESETZUNG ing der einzelnen Zeichenfolge nach der Trennung durch Komma getrennte Werte
  • Gibt es einen Grund, Sie haben eine gespeicherte Prozedur verwenden? In anderen Worten, was ist falsch mit dem Bau einer regelmäßigen DELETE * FROM Table WHERE id IN (1,2,3,5,20,25,50) SQL-Anweisung und nur ihn direkt auszuführen?
  • aber wenn Sie wollen, zu verwenden, WOBEI id die Sie haben, um integer-Werte, keine Notwendigkeit casting-Werte zu einem string @Abey
  • JA die WHERE ID IN () - Klausel sieht einfach aus, aber dann vorstellen, dass alle sql-string verketten, dass ich in meinem client-code. Ich sehe das nicht als eine sehr nette Weise, es zu tun - Fehler anfällig und Wartungs-Albtraum.
  • Ich bin mir nicht sicher sehe ich den Widerspruch entweder als fehleranfällig oder ein Wartungs-Albtraum. Es ist wie eine Art zu sagen Blick auf diese "for i = 1 to 10000/str = str + i + ","/next i" Mann, was für ein Wartungs-Albtraum, es tut 10,000 Verkettungen! Sogar, wenn Sie die Werte zu speichern in einer temp-Tabelle können Sie erstellen, die IN der Klausel aus, die temp-Tabelle wie abgebildet.

InformationsquelleAutor Abey | 2013-02-23
Schreibe einen Kommentar