sql >> Databasteknik >  >> RDS >> Sqlserver

sp_executesql med 'IN'-sats

Anledningen till att det inte fungerar är att @P1 behandlas som ett enda värde.

t.ex. när @Code är X101,B202 så körs frågan bara som:SELECT * FROM Table WHERE RegionCode IN ('X101,B202')Så, den letar efter en RegionCode med värdet som finns med @P1. Även när du inkluderar enstaka citattecken betyder det bara att värdet den söker efter i RegionCode förväntas innehålla dessa enstaka citattecken.

Du måste faktiskt sammanfoga @Code-variabeln i @Cmd sql-kommandotexten för att den ska fungera som du tänker:

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

Uppenbarligen öppnar detta bara upp för SQL-injektion så du måste vara mycket försiktig om du använder det här för att se till att du skyddar dig mot det.

Det finns alternativa sätt att hantera denna situation där du vill skicka in en dynamisk lista med värden att söka efter.

Kolla in exemplen på min blogg för 2 tillvägagångssätt kan du använda med SQL Server 2005. En innebär att skicka in en CSV-lista i formen "Value1, Value2, Value3" som du sedan delar upp i en TABLE-variabel med hjälp av en användardefinierad funktion (det finns många omnämnanden av detta tillvägagångssätt om du gör en snabb google eller sökning på den här webbplatsen). När du har delat ut, går du sedan med i den TABLE-varianten till din huvudfråga. Den andra metoden är att skicka in en XML-klump som innehåller värdena och använda den inbyggda XML-funktionaliteten i SQL Server. Båda dessa tillvägagångssätt demonstreras med prestandamått i den länken, och de kräver ingen dynamisk SQL.

Om du använde SQL Server 2008 skulle tabellvärdeparametrar vara rätt väg att gå - det är det tredje tillvägagångssättet som jag visar i den länken som blir bäst.



  1. Postgres där klausul jämför tidsstämpel

  2. Hur räknar man alla poster men bara hämtar (LIMIT) ett specifikt nummer för visning?

  3. Undvik dubbla citattecken med variabel inuti HTML-eko

  4. SQL UNION ALL för att eliminera dubbletter