Я действительно заинтригован этим. Для начала я выполнил эти два запроса к таблице с 13221 строками и получил каждую строку в первом экземпляре и примерно половину из них во втором:
declare @rad char(30)
select @rad = '%'
select count(*) from xofdoc where docdesc like '%%%'
select count(*) from xofdoc where docdesc like '%' + @rad + '%'
С другой стороны, если я изменю объявление @rad на varchar (30), оба запроса вытянут все строки.
Причина, по которой я об этом говорю, заключается в том, что может быть что-то, что происходит с объявлением данных вашего @IsTag. Вы не сказали, как это было объявлено. Это важно, потому что char - это строка фиксированной длины, что означает, что char (5), например, со значением '%'
будет иметь значение '% '
. Таким образом, утверждение '%' + '% ' + '%'
оценивается как: '%% %'
. Таким образом, он будет искать только те строки, которые имеют по крайней мере четыре последовательных пробела в столбце «где бы то ни было». С другой стороны, varchar является элементом переменной длины, и завершающие пробелы игнорируются, что приводит к '%%%'
в приведенном выше случае и, таким образом, подстановочным знакам для всего столбца.
Отредактировано для добавления : nchar или char, в этом случае нет никакой разницы. Если вы сейчас используете nchar, измените его на nvarchar.