Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL IN-Klausel in gespeicherter Prozedur

Dazu gibt es mehrere Möglichkeiten:

  1. Dynamisches SQL, wie in diesem Artikel beschrieben:http://asheej.blogspot.com/2012/04/how-to-use-ms-sql-in-clause-with.html

  2. Geben Sie jedes Element in Variablen an (das kann ziemlich hässlich werden, wenn Sie viele davon haben):

    @var1 varchar(20),@var2 varchar(20),@var3 varchar(20)

  3. Schreiben Sie eine Split-Funktion, um die Zeichenfolge in eine Tabellenvariable umzuwandeln, es gibt viele davon. Dies ist mein persönlicher Favorit:http://dataeducation.com/faster -more-scalable-sqlclr-string-splitting/

  4. Verwenden Sie einen Tabellenwertparameter (2008):http://www.techrepublic.com/blog/datacenter/passing-table-valued-parameters-in-sql-server-2008/168

  5. Hier ist ein kleiner Trick mit CHARINDEX (beachten Sie, dass dieser Ansatz Non-Sargable ist):

Ihr String sieht so aus:'abc,def'

Verwenden von CHARINDEX , füllen Sie sowohl die Suchzeichenfolge als auch den Wert, den Sie innerhalb der Suchzeichenfolge finden möchten, mit Ihrem Trennzeichen auf. In meinem kleinen Beispiel würde der String also zu ',abc,def' werden. Beachten Sie die zusätzlichen Kommas am Anfang und am Ende. Machen Sie dann dasselbe mit den Felddaten. Wenn Sie Kommas in Ihren Daten haben, müssen Sie das Trennzeichen durch etwas anderes ersetzen, wie z. B. char(2) oder Semikolons oder was auch immer.

Führen Sie dann die Suche durch:

WHERE CHARINDEX ( ',' + expressionToFind + ',' , ',' + expressionToSearch ',') > 0

Das Trennzeichen-Padding verhindert, dass die Suche "abcabc" findet, findet aber "abc", exakte Übereinstimmung.

Wenn Sie 2005 verwenden, würde ich mir eine wirklich schnelle Split-Funktion zulegen, damit Sie die Verwendung von dynamischem SQL vermeiden können.