Benutzer mit den meisten Antworten
SQL Abfrage mit variablem IN() Inhalt

Frage
-
Hallo zusammen,
ich verzweifle gerade an einer SQL-Abfrage im Abfrage-Generator.
Leider habe ich nichts gefunden, wie ich das besser lösen kann. Vielleicht habt Ihr einen Tipp für mich.
Abfragen möchte ich mehrere Datensätze also:
SELECT *
FROM tbl1
WHERE tbl1.ID = 3 OR tbl1.ID = 7 OR tbl1.ID = 20 OR ... usw.
Man kann ja auch so schreiben
WHERE tbl1.ID IN ('3', '7', '20')
Ich würde nun gern den Inhalt und die Anzahl der Werte in der IN-Klammer variabel lassen also @IDs, nur wenn ich dass so löse:
WHERE tbl1.ID IN (@IDs)
Und in @IDs übergebe ich '3', '7', '20'
dann erhalte ich die Fehlermeldung, die Eingabezeichenfolge hätte das falsche Format.
Klar die Zeichenfolge ist ja jetzt ein String.
Die Werte kommen aus einem DataGrid mit SelectionMode="Extended"
Bei msdn habe ich gelesen, dass die Werte für die Abfrage aus einer Tabelle oder Liste kommen können. Leider war da kein Beispiel dabei. Wisst Ihr wie man das macht?
Vielen Dank im Voraus!
Schönen Gruß
Andreas
- Verschoben Aleksander Chalabashiev Freitag, 17. April 2015 11:21
Antworten
-
Hallo Andreas,
mit dem IN Operator in Kombination einer festen Werte-Liste muss man etwas vorsichtig ein. Mit einer kleinen Anzahl funtioniert es problemlos, kommen ein paar Hunderte und mehr zusammen, kann es auf Fehler laufen, siehe IN (Transact-SQL) => Hinweise:
"Wenn eine IN-Klausel eine extrem hohe Anzahl von Werten (viele Tausende) enthält, können die Ressourcen überbeansprucht werden und die Fehler 8623 oder 8632 auftreten. Speichern Sie die Elemente in der IN-Liste in einer Tabelle, um dieses Problem zu umgehen."
Ich hatte Fälle, da trat das Problem erst bei 20 Tsd Werten auf, aber auch schon bei ein paar Hunderten; das kann man nicht wirklich vorhersagen.
Und das Speichern der Werte in einer (temporären) Tabelle kann so aussehen:
CREATE TABLE #ids (id int); INSERT INTO #ids (id) VALUES (3), (5), (7), (9), (12); SELECT * FROM sys.objects -- Nur als Beispiel WHERE object_id IN (SELECT id FROM #ids); GO DROP TABLE #ids;
Olaf Helper
[ Blog] [ Xing] [ MVP]- Bearbeitet Olaf HelperMVP Freitag, 17. April 2015 11:26
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 21. April 2015 13:16
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 28. April 2015 11:16
Alle Antworten
-
Hallo Andreas,
mit dem IN Operator in Kombination einer festen Werte-Liste muss man etwas vorsichtig ein. Mit einer kleinen Anzahl funtioniert es problemlos, kommen ein paar Hunderte und mehr zusammen, kann es auf Fehler laufen, siehe IN (Transact-SQL) => Hinweise:
"Wenn eine IN-Klausel eine extrem hohe Anzahl von Werten (viele Tausende) enthält, können die Ressourcen überbeansprucht werden und die Fehler 8623 oder 8632 auftreten. Speichern Sie die Elemente in der IN-Liste in einer Tabelle, um dieses Problem zu umgehen."
Ich hatte Fälle, da trat das Problem erst bei 20 Tsd Werten auf, aber auch schon bei ein paar Hunderten; das kann man nicht wirklich vorhersagen.
Und das Speichern der Werte in einer (temporären) Tabelle kann so aussehen:
CREATE TABLE #ids (id int); INSERT INTO #ids (id) VALUES (3), (5), (7), (9), (12); SELECT * FROM sys.objects -- Nur als Beispiel WHERE object_id IN (SELECT id FROM #ids); GO DROP TABLE #ids;
Olaf Helper
[ Blog] [ Xing] [ MVP]- Bearbeitet Olaf HelperMVP Freitag, 17. April 2015 11:26
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 21. April 2015 13:16
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 28. April 2015 11:16