sql >> Database >  >> RDS >> Sqlserver

sp_executesql met 'IN'-instructie

De reden dat het niet werkt, is omdat @P1 wordt behandeld als één enkele waarde.

bijv. wanneer @Code X101,B202 is, wordt de query gewoon uitgevoerd als:SELECT * FROM Table WHERE RegionCode IN ('X101,B202')Dus het zoekt naar een RegionCode met de waarde die bij @P1 staat. Zelfs als u enkele aanhalingstekens opneemt, betekent dit alleen dat de waarde waarnaar in RegionCode wordt gezocht, deze enkele aanhalingstekens zal bevatten.

U moet de @Code-variabele samenvoegen in de @Cmd sql-opdrachttekst om het te laten werken zoals u denkt:

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

Het is echter duidelijk dat dit je alleen maar openstelt voor SQL-injectie, dus je moet heel voorzichtig zijn als je deze aanpak volgt om ervoor te zorgen dat je je daartegen wapent.

Er zijn alternatieve manieren om met deze situatie om te gaan waarin u een dynamische lijst met waarden wilt doorzoeken.

Bekijk de voorbeelden op mijn blog voor 2 benaderingen die je zou kunnen gebruiken met SQL Server 2005. Een daarvan is het doorgeven van een CSV-lijst in de vorm "Value1,Value2,Value3" die je vervolgens opsplitst in een TABLE-variabele met behulp van een door de gebruiker gedefinieerde functie (er zijn veel vermeldingen van dit aanpak als u snel googlet of op deze site zoekt). Eenmaal opgesplitst, voeg je die TABLE-var toe aan je hoofdquery. De tweede benadering is om een ​​XML-blob met de waarden door te geven en de ingebouwde XML-functionaliteit van SQL Server te gebruiken. Beide benaderingen worden gedemonstreerd met prestatiestatistieken in die link, en ze vereisen geen dynamische SQL.

Als u SQL Server 2008 zou gebruiken, zouden tabelwaardeparameters de juiste keuze zijn - dat is de derde benadering die ik in die link laat zien en die het beste uitkomt.



  1. MySQL-datumformaat DD/MM/JJJJ zoekopdracht selecteren?

  2. C# -- Gegevens ophalen uit MySQL en ze bestellen op pagina's zonder DataGridView

  3. Overzicht creëren over verschillende databases

  4. Is het nodig om een ​​index te hebben op elke combinatie van doorzoekbare velden in een SQL-tabel om de prestaties te optimaliseren?