Причината да не работи е, че @P1 се третира като една единствена стойност.
напр. когато @Code е X101,B202, тогава заявката просто се изпълнява като:SELECT * FROM Table WHERE RegionCode IN ('X101,B202')Така че търси RegionCode със стойността, която се съдържа в @P1. Дори когато включите единични кавички, всичко това означава, че стойността, която търси в RegionCode, се очаква да съдържа тези единични кавички.
Трябва действително да свържете променливата @Code в текста на командата @Cmd sql, за да може тя да работи по начина, по който си мислите:
SET @Code = '''X101'',''B202'''
SET @Cmd = 'SELECT * FROM Table WHERE RegionCode IN (' + @Code + ')'
EXECUTE (@Cmd)
Очевидно обаче това просто ви отваря към SQL инжектиране, така че трябва да сте много внимателни, ако използвате този подход, за да сте сигурни, че се предпазвате от това.
Има алтернативни начини за справяне с тази ситуация, при която искате да подадете динамичен списък със стойности за търсене.
Разгледайте примерите в моя блог за 2 подхода, които бихте могли да използвате с SQL Server 2005. Единият включва предаване на CSV списък във формата „Стойност1, Стойност2, Стойност3“, който след това разделяте на променлива TABLE с помощта на дефинирана от потребителя функция (има много споменавания за това подход, ако направите бързо търсене в Google или този сайт). След като се разделите, след това присъединявате тази TABLE променлива към основната си заявка. Вторият подход е да се предаде XML blob, съдържащ стойностите, и да се използва вградената XML функционалност на SQL Server. И двата подхода са демонстрирани с показатели за ефективност в тази връзка и не изискват динамичен SQL.
Ако използвате SQL Server 2008, параметрите на стойността на таблицата биха били правилният начин - това е третият подход, който демонстрирам в тази връзка, който излиза най-добре.