Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

sp_executesql z instrukcją „IN”

Powodem, dla którego to nie działa, jest to, że @P1 jest traktowane jako jedna, pojedyncza wartość.

np. gdy @Code to X101,B202, zapytanie jest po prostu uruchamiane jako:SELECT * FROM Table WHERE RegionCode IN ('X101,B202')Więc szuka RegionCode z wartością zawartą w @P1. Nawet jeśli uwzględnisz pojedyncze cudzysłowy, wszystko to oznacza, że ​​wartość, której szuka w RegionCode, powinna zawierać te pojedyncze cudzysłowy.

Musiałbyś faktycznie połączyć zmienną @Code z tekstem polecenia @Cmd sql, aby działała tak, jak myślisz:

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

Oczywiście, to po prostu otwiera cię na wstrzyknięcie SQL, więc musisz być bardzo ostrożny, jeśli zastosujesz takie podejście, aby upewnić się, że się przed tym uchronisz.

Istnieją alternatywne sposoby radzenia sobie z tą sytuacją, w której chcesz przekazać dynamiczną listę wartości do wyszukania.

Sprawdź przykłady na moim blogu dla 2 podejść można użyć z SQL Server 2005. Jedno obejmuje przekazanie listy CSV w postaci "Wartość1,Wartość2,Wartość3", którą następnie dzielisz na zmienną TABLE za pomocą funkcji zdefiniowanej przez użytkownika (jest wiele wzmianek na ten temat podejście, jeśli robisz szybkie google lub przeszukujesz tę stronę). Po rozdzieleniu dołączasz tę zmienną TABELI do głównego zapytania. Drugie podejście polega na przekazaniu obiektu blob XML zawierającego wartości i użyciu wbudowanej funkcjonalności XML SQL Server. Oba te podejścia są demonstrowane z metrykami wydajności w tym łączu i nie wymagają dynamicznego SQL.

Gdybyś używał SQL Server 2008, dobrym rozwiązaniem byłyby parametry wartości tabeli — to trzecie podejście, które zademonstrowałem w tym łączu, które wychodzi najlepiej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utworzyć użytkownika w bazie danych Azure SQL przy użyciu funkcji platformy Azure?

  2. SQL Server Compact Edition ISNULL(sth, ' ') zwraca wartość logiczną?

  3. Łączna liczba SQL

  4. Wybierz wiersze i Zaktualizuj te same wiersze do zablokowania?

  5. SQL Server 2008 Backup Compression Standard Edition