Ich habe eine große Liste von int-Parametern für eine SQL-Abfrage:
%Vor%Mein Problem ist, dass es in SQL Server 2000 ein Limit für Parameter gibt. Ich könnte diese Abfrage auch auf einem SQL Server 2008 ausführen.
Was ist der bessere Weg, dies zu tun?
Bearbeiten:
Die Liste der IDs stammt aus einem C # Programm. Nicht von einer anderen Tabelle.
Die beste funktionierende Lösung für mich war SQL Server 2008: Table Valued Parameters
100000 Ids benötigt 14-20s, 1000 Ids benötigt ~ 140ms.
%Vor%Der benutzerdefinierte Tabellen-Typ:
%Vor%Ein alternativer Ansatz, der mit SQL 2000 funktioniert, ist die Verwendung von XML.
Formatieren Sie das Programm / die Anwendung wie folgt:
%Vor%.
Erstellen Sie dann die folgende gespeicherte Prozedur:
.
Dann kann Ihre Anwendung diesen SP aufrufen und einen potenziell riesigen Text / XML-Block übergeben.
Beachten Sie, dass bei root
, TMP
und J
die Groß- / Kleinschreibung beachtet wird.
Um jeden Preis VERMEIDEN IN
; vor allem, wenn Sie nach 2000 sind. mein Backup
Verwenden Sie stattdessen EXISTS
Teilen Sie die Daten in kleinere Gruppen und führen Sie mehrere Aktualisierungsabfragen aus.
Es gibt keinen Grund, eine temporäre Tabelle zu verwenden, da Sie die Daten von außerhalb der Datenbank abrufen, so dass es nicht möglich ist, die Übertragung in Richtung db zu vermeiden.
Wenn die Ints sequentiell sind (mehr als zwei auf einmal), könnten Sie sie in BETWEEN
pairs machen.
Aber machen Sie in diesem Fall einfach eine Zeichenkette dieser Ints und übergeben Sie diese als einzelnen varchar(max)
-Parameter.
Ich denke, dass Sie wahrscheinlich eine speicherbasierte temporäre Tabelle mit einem Index erstellen möchten. Angenommen, die Tabelle, die Sie abfragen, groß ist, möchten Sie keinen Tabellenscan durchführen, bei dem jede Zeile mit jeder Ihrer 5000 Übereinstimmungen verglichen wird. Sie möchten einen Join mit Hilfe von zwei Indizes durchführen.
%Vor%Tags und Links sql-server c# sql-server-2008 sql-server-2000