Fehler beim Konvertieren des varchar-Werts

Fenghuang

Benutzer
Beiträge
14
Hallo,

wie übergibt man einer Where-Klausel eine Zahlenliste?

Diese Abfrage liefert das gewünsche Ergebnis:
SELECT * FROM [dbo].[v_TR] WHERE Counter in (648,649,650,652...)

Wenn die Zahlenliste in einem Parameter steckt wie hier
DECLARE @counter varchar(1000)
SET @counter = (SELECT STRING_AGG(Counter,',') FROM [dbo].[tb_Rec]);
SELECT * FROM [dbo].[v_TR] WHERE Counter in (@counter)


bekomme ich folgende Fehlermeldung:

Fehler beim Konvertieren des varchar-Werts "648,649,650,652,653,654,655,697,698,754,755,756,757,860,861,862,885,1099,1227,1274,1314,1315,10,32,53,364,648,649,650,652,653,654,655,697,698,754,755,756,757,860,861,862,885,1099,1227,1274,1314,1315,10,32,53,364,648,649,650,652,653,654,655,697,698,754,755,756,757,860,861,862,885,1099,1227,1274,1314,1315,10,32,53,364,648,649,650,652,653,654,655,697,698,754,755,756,757,860,861,862,885,1099,1227,1274,1314,1315,10,32,53,364,648,649,650,652,653,654,655,697,698,754,755,756,757,860,861,862,885,1099,1227,1274,1314,1315" in den int-Datentyp.

Wie macht man es richtig?

Danke für eure Hilfe
 
Werbung:
was funktioniert:

Code:
test=# create table fenghuang( i int);
CREATE TABLE
test=*# insert into fenghuang select * from generate_series(1,10) s;
INSERT 0 10
test=*# select * from fenghuang ;
 i  
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)

test=*# select * from fenghuang where i in (2,3,6,7);
 i
---
 2
 3
 6
 7
(4 rows)

was Du machst:

Code:
test=*# select * from fenghuang where i in ('2,3,6,7');
FEHLER:  ungültige Eingabesyntax für Typ integer: »2,3,6,7«
LINE 1: select * from fenghuang where i in ('2,3,6,7');
                                            ^
test=*#

Finde den Unterschied!
 
Vorweg, Ich habe lange nicht mehr mit TSQL gearbeitet.
Diese Frage gibt es in dutzenden Varianten, die Antwort ist vermutlich: Es geht nicht.

Der Parameter kann nicht in mehrere Werte umgewandelt werden. Man bräuchte viele Parameter.

Einige Hinweise dazu
- das Statement dynamisch zusammenbauen und mit einer Execute Operation laufen lassen (weiß nicht, welche sp_ das in TSQL macht)
- MSSQL dürfte JSON können, das könnte ein Workaround zur Parameterübergabe sein (je nach Funktionsumfang für JSON in TSQL)
- where in () ist ja nur eine "bequeme" Schreibweise für einen Join. Also die Zahlen per Insert in eine Tabelle schieben (oder gleich dort belassen, wenn sie schon dort sind) und das SQL auf ein Join mit der Tabelle umbauen.

P.S.: Der dynamische Zusammenbau des Statements sollte dafür sorgen, dass alle Werte und Spielregeln eingehalten werden. (Da es eine "interne" Funktion ist, wahrscheinlich machbar, die Frage ist bei sowas immer, woher kommen die Parameterinhalte und wie verlässlich ist das)
 
Code:
test=*# select * from fenghuang where i in ('2,3,6,7');
FEHLER:  ungültige Eingabesyntax für Typ integer: »2,3,6,7«
LINE 1: select * from fenghuang where i in ('2,3,6,7');
                                            ^
test=*#

Finde den Unterschied!

Der Fehler wäre gefunden, fehlt nur noch die Lösung :)
Es ginge natürlich mit einer temporären Tabelle, die ich mit den Werten fülle und mit einem Join verknüpfe aber gibt es keine Möglichkeit ihm zu sagen dass er die ' einfach ignorieren soll?
 
Warum überhaupt der Umweg über eine Variable?

Code:
SELECT *
FROM [dbo].[v_TR]
WHERE Counter in (SELECT Counter
                  FROM [dbo].[tb_Rec])
 
Warum überhaupt der Umweg über eine Variable?

Code:
SELECT *
FROM [dbo].[v_TR]
WHERE Counter in (SELECT Counter
                  FROM [dbo].[tb_Rec])

Gute Frage. Brauchen tu ich das in einem Insert-Trigger. Die Counter-Werte kommen aus dem Insert. Nachdem ich mir aus der [dbo].[v_TR] alle notwendigen Daten geholt habe, werden Daten aus einer anderen Tabelle gelöscht.
Ich wollte sie zwischenspeichern, um nicht zwei Mal auf die Insert-Tabelle zugreifen zu müssen.
 
Werbung:
Ich wollte sie zwischenspeichern, um nicht zwei Mal auf die Insert-Tabelle zugreifen zu müssen.

Die "Insert-Tabelle" ist letztendlich auch nur eine (Table) Variable.

Du könntest natürlich die Daten der einen Variable in eine andere kopieren:
Code:
declare @parameters table (counter integer)

insert into @parameters
select counter
from inserted

select *
from dbo.v_tr
where counter in (select counter from @parameters)
Aber ob das Sinn macht, wage ich zu bezweifeln.
 
Zurück
Oben