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

WHERE IN (tablica identyfikatorów)

Nie możesz (niestety) tego zrobić. Parametr Sql może być tylko pojedynczą wartością, więc musisz zrobić:

WHERE buildingID IN (@buildingID1, @buildingID2, @buildingID3...)

Co oczywiście wymaga znajomości liczby identyfikatorów budynków lub dynamicznego konstruowania zapytania.

Jako obejście* wykonałem następujące czynności:

WHERE buildingID IN (@buildingID)

command.CommandText = command.CommandText.Replace(
  "@buildingID", 
  string.Join(buildingIDs.Select(b => b.ToString()), ",")
);

który zastąpi tekst oświadczenia liczbami, kończąc na czymś w rodzaju:

WHERE buildingID IN (1,2,3,4)
  • Zauważ, że zbliża się to do podatności na wstrzyknięcie Sql, ale ponieważ jest to tablica int, jest bezpieczna. Arbitralne ciągi nie bezpieczne, ale nie ma możliwości osadzenia instrukcji Sql w liczbie całkowitej (lub datetime, boolean, itp.).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dynamiczne wykonywanie SQL w SQL Server

  2. Jak używać FILEPROPERTY() w SQL Server

  3. Unikaj tych 4 typowych błędów DBA

  4. Test wydajności MS SQL Server w systemie Linux i Windows w celu wykrycia różnicy

  5. Czy możemy przekazać parametry do widoku w SQL?