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

sp_executesql mit 'IN'-Anweisung

Der Grund, warum es nicht funktioniert, ist, dass @P1 als ein einziger Wert behandelt wird.

z.B. Wenn @Code X101,B202 ist, wird die Abfrage nur ausgeführt als:SELECT * FROM Table WHERE RegionCode IN ('X101,B202') Es wird also nach einem RegionCode mit dem Wert gesucht, der in @P1 enthalten ist. Selbst wenn Sie einfache Anführungszeichen einfügen, bedeutet dies lediglich, dass der in RegionCode gesuchte Wert diese einfachen Anführungszeichen enthalten muss.

Sie müssten die @Code-Variable tatsächlich mit dem @Cmd-SQL-Befehlstext verketten, damit sie so funktioniert, wie Sie denken:

SET @Code = '''X101'',''B202'''
SET @Cmd = 'SELECT * FROM Table WHERE RegionCode IN (' + @Code + ')'
EXECUTE (@Cmd)

Offensichtlich öffnet Sie dies jedoch nur für SQL-Injection, sodass Sie sehr vorsichtig sein müssen, wenn Sie diesen Ansatz wählen, um sicherzustellen, dass Sie sich davor schützen.

Es gibt alternative Möglichkeiten, mit dieser Situation umzugehen, wenn Sie eine dynamische Liste von Werten übergeben möchten, nach denen gesucht werden soll.

Sehen Sie sich die Beispiele in meinem Blog an für 2 Ansätze, die Sie mit SQL Server 2005 verwenden könnten. Einer besteht darin, eine CSV-Liste in der Form „Wert1, Wert2, Wert3“ zu übergeben, die Sie dann mithilfe einer benutzerdefinierten Funktion in eine TABLE-Variable aufteilen (es gibt viele Erwähnungen davon Ansatz, wenn Sie schnell googlen oder diese Website durchsuchen). Nach der Aufteilung verbinden Sie diese TABLE-Variable mit Ihrer Hauptabfrage. Der zweite Ansatz besteht darin, ein XML-Blob zu übergeben, das die Werte enthält, und die integrierte XML-Funktionalität von SQL Server zu verwenden. Beide Ansätze werden mit Leistungsmetriken in diesem Link demonstriert und erfordern kein dynamisches SQL.

Wenn Sie SQL Server 2008 verwenden, wären Tabellenwertparameter der richtige Weg - das ist der dritte Ansatz, den ich in diesem Link demonstriere, der am besten herauskommt.