sql >> Database teknologi >  >> RDS >> Sqlserver

sp_executesql med 'IN'-sætning

Grunden til at det ikke virker, er fordi @P1 behandles som én enkelt værdi.

for eksempel. når @Code er X101,B202, så køres forespørgslen bare som:SELECT * FROM Table WHERE RegionCode IN ('X101,B202')Så den leder efter en RegionCode med den værdi, der er indeholdt i @P1. Selv når du inkluderer enkelte anførselstegn, betyder det kun, at den værdi, den søger efter i RegionCode, forventes at indeholde disse enkelte anførselstegn.

Du skal faktisk sammenkæde @Code-variablen i @Cmd sql-kommandoteksten, for at den kan fungere som du tænker:

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

Selvfølgelig åbner dette dig bare for SQL-injektion, så du skal være meget forsigtig, hvis du tog denne tilgang for at sikre dig, at du beskytter dig mod det.

Der er alternative måder at håndtere denne situation på, hvor du ønsker at sende en dynamisk liste af værdier til at søge efter.

Se eksemplerne på min blog for 2 tilgange, du kunne bruge med SQL Server 2005. Den ene involverer indlevering af en CSV-liste i formen "Værdi1,Værdi2,Værdi3", som du derefter deler ud i en TABLE-variabel ved hjælp af en brugerdefineret funktion (der er mange omtaler af denne tilgang, hvis du laver en hurtig google eller søgning på dette websted). Når du er delt ud, slutter du dig derefter til TABLE-varianten til din hovedforespørgsel. Den anden tilgang er at indsætte en XML-blob, der indeholder værdierne, og bruge den indbyggede XML-funktionalitet i SQL Server. Begge disse tilgange er demonstreret med ydeevnemålinger i det link, og de kræver ingen dynamisk SQL.

Hvis du brugte SQL Server 2008, ville Table Value Parameters være vejen at gå - det er den 3. tilgang, jeg demonstrerer i det link, som kommer bedst ud.



  1. Hvordan beregner man det samlede salg pr. måned i MySQL?

  2. Hvordan indstiller jeg i en Rails-migrering standardværdien for en kolonne til at være NOW() i stedet for det tidspunkt, hvor jeg kørte migreringen?

  3. Indsættelse af data fra en DataGridView til en database

  4. Konfigurerer apache supersæt med mysql database