Sql server LIKE Оператор с разделенной запятой строкой

Моя хранимая процедура получает параметр, который представляет собой строку, разделенную запятыми:

DECLARE @review_status varchar(200) SET @review_status='CANCELLED,INSPECTED,REJECTED,UNASSIGNED' 

Я использую эту переменную с LIKE Operator, когда значение без запятой тогда совершенное, но оно имеет запятую, а затем неспособно обрабатывать. Теперь я использую это утверждение

 SELECT * FROM tblReview WHERE review_status LIKE '%' + @review_status + '%' 

Мне нужно сделать из этого это утверждение

 SELECT * FROM tblReview WHERE review_status LIKE '%CANCELLED%' OR --Pass @review_status review_status LIKE '%INSPECTED%' OR review_status LIKE '%REJECTED%'..... 

Какова наилучшая практика для этого?

Для этого вы можете использовать разделитель строк. Прочтите эту статью для одного из самых быстрых сплиттеров.

Затем вам нужно использовать оператор IN для фильтрации:

 SELECT * FROM tblReview WHERE review_status IN( SELECT item FROM dbo.DelimitedSplit8K(@review_status,',') ) 

Поскольку вы используете LIKE , вы можете сделать JOIN вместо IN :

 SELECT * FROM tblReview t INNER JOIN dbo.DelimitedSplit8K(@review_status, ',') s ON t.review_status LIKE '%' + s.Item + '%' 

Попробуйте сначала преобразовать varchar с запятыми в таблицу, как описано здесь http://blogs.msdn.com/b/amitjet/archive/2009/12/11/sql-server-comma-separated-string-to-table.aspx , Затем используйте следующее:

 CREATE TABLE #allPattern ( pattern NVARCHAR(max) ); INSERT INTO #allPattern VALUES ('%CANCELLED%'), ('%INSPECTED%'), ('%REJECTED%'); SELECT t.* FROM tblReview t JOIN #allPattern a ON (t.review_status LIKE a.pattern); 

Вы можете добавить CHARINDEX() и CHARINDEX() запятую к вашей строке, а затем использовать CHARINDEX() .

 SET @review_status=',CANCELLED,INSPECTED,REJECTED,UNASSIGNED,' SELECT * FROM tblReview WHERE charindex(','+review_status+',', '@review_status') >0 

Запятые в начале и в конце строки используются, чтобы сделать точную строку поиска возможной – например, если у вас есть два состояния – один называется CAN, а второй называется CANCELED, charindex без боковых запятых найдет их обоих.

Это самый простой способ, но не тот, который имеет лучшую производительность, поэтому не используйте его на длинных CSV-файлах.

Interesting Posts

Сохраненная процедура сервера Sql

Выберите n количество случайных строк, где n пропорционально отношению каждого значения% от общей численности

Добавить счет в корневые элементы, используя FOR XML PATH

Недопустимый экземпляр при использовании ADODB.Recordset

Как кодировать языковые символы при преобразовании varbinary () в varchar (max) в SQL Server 2012?

Как определить, имеет ли поле ведущие нули в SQL Server 2008 R2?

Зеркалирование базы данных между виртуальными машинами Windows Azure

Подсчет между двумя датами

Схема рефакторинга с несколькими отношениями «многие ко многим» к семантически различным, но структурно подобным объектам?

Sql Server 2008 Перекрестная привязка таблицы таблиц (отношений)

Подсчитайте количество лет с определенной даты SQL

Использование параметра User Defined Datatype в качестве параметра хранимой процедуры?

SQL Complex Select – запрос формирования запроса

Перенос данных из одной базы данных в другую базу данных

Как получить результирующие наборы из выполнения tsql?

Давайте будем гением компьютера.