Filterfelder in 'IN' -Klausel mit einer variables

Ich möchte so etwas machen:

DECLARE @list nvarhcar(200) SET @list = 'VALUE1,VALUE2,VALUE3' Select * from foo where field in (@list) 

Bis heute habe ich mit sp_executeSQL Prozedur, meine eigene databasefunktion csv2table und subselect getriggers, aber ich denke das ist nicht sehr sauber.

Gibt es eine Möglichkeit zu lösen ohne Verwendung dynamische sql? Gibt es eine direkte Methode?

Ich verwende Microsoft Sql server 2005.

Vielen Dank!

Würden Sie bitte versuchen, wie unten: Danke

 DECLARE @list nvarchar(200) SET @list = 'VALUE1,VALUE2,VALUE3' SELECT * FROM foo WHERE CHARINDEX(',' + field + ',', ',' + @list + ',') > 0 

Teil A als UDF erstellen

 /* Part A */ DECLARE @list Varchar(max) = 'VALUE1,VALUE2,VALUE3' DECLARE @tmpTbl_Values Table (ID varchar(50)) Set @list = @list + ',' -- Indexes to keep the position of searching Declare @Pos1 Int Declare @pos2 Int -- Start from first character Set @Pos1=1 Set @Pos2=1 While @Pos1<Len(@list) Begin Set @Pos1 = CharIndex(',',@list,@Pos1) Insert @tmpTbl_Values Select Cast(Substring(@list,@Pos2,@Pos1-@Pos2) As varchar(50)) -- Go to next non comma character Set @Pos2=@Pos1+1 -- Search from the next charcater Set @Pos1 = @Pos1+1 End /* Part B */ SELECT * FROM foo A INNER JOIN @tmpTbl_Values B ON AB.ID = B.ID 

Eine Alternative:

 Select * from foo where '%,' + field + ',%' like ',' + (@list) + ',' 

Das ist sogar "schmutziger" als der bestehende Ansatz.

Im Idealfall würde ich vorschlagen, die Abfragezeichenfolge zu ändern:

 Select * from foo where field in () 

dann durchlesen die list der Werte in @list, Einfügen eines ? für jeden Wert (getrennt durch Kommas) und Bindung jedes Wertes an diesen Parameter-Marker. Allerdings weiß ich nicht, wie dies in dynamischen SQL allein zu erreichen.

Wenn der datatyp für das Feld nchar oder varchar ist, sucht der IN () – Operator nach Wert wie

 IN('VALUE1','VALUE2','VALUE3', etc..) 

Also hast du deine @list so eingestellt

Ein möglicher Ansatz besteht darin, Folgendes zu tun:

 SELECT * FROM foo WHERE CHARINDEX(',' + field + ',', ',' + @list + ',') > 0 

Dies geht davon aus, dass die data im Feld kein Komma darin haben

Wenn du mit einem String-Feld umgehen kannst, kannst du so etwas benutzen

 DECLARE @csv varchar(50) = 'item1,item2, item3, item4 ,item5' SELECT * FROM foo WHERE PATINDEX('%' + Field + '%', @csv) > 0 

In SQL 2005 können Sie eine benutzerdefinierte UDF verwenden, um eine abgegrenzte list in eine Tabelle zu parsing – siehe diesen Artikel http://www.sommarskog.se/arrays-in-sql-2005.html