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.