2010-08-04 2 views
2

У меня есть оператор выбора, который используется в GridView с помощью хранимой процедуры:Подстановочные знаки SQL, не возвращающие данные?

SELECT * FROM T_Computer WHERE (ISTag LIKE '%' + @ISTag + '%') AND Status <> 'Trashed' AND Status <> 'Sold' AND Status <> 'Stored' 

В @ISTag, NCHAR определяется значением текстового поля, если текстовое поле пусто у меня есть значение по умолчанию установлено значение %, что, по моему мнению, должно по существу отрицать эту часть предложения where и возвращать все строки, кроме тех, которые отрицаются столбцом Status. Вместо этого он ничего не возвращает. Если я удалю «+ @ISTag +», он сделает то, что я хочу.

В принципе, три% ничего не возвращают, а 2% возвращают то, что я хочу. Как мне это исправить?

+1

Вы не говорите, как вы объявляете @IsTag: char или varchar? Если вы объявляете его char, тогда см. Мой ответ. Если это варчар, тогда происходит что-то еще. – Cyberherbalist

+0

Объявлено как nchar – Shawn

+0

Та же разница. char и nchar функционально одинаковы в этом случае. В моем тестовом примере я получаю тот же результат либо с результатом, например с вашим. Используйте nvarchar, как указано в моем ответе, и посмотрите, не изменилось ли это. – Cyberherbalist

ответ

3

Я действительно заинтригован этим. Для начала, я запустил эти два запросов к таблице с 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), например, установленный на значение '%', фактически будет иметь значение '% '. Таким образом, заявление '%' + '% ' + '%' оценивает по: '%% %'. Таким образом, он будет находить строки, которые имели бы по крайней мере четыре последовательных пробела в столбце whered. С другой стороны, varchar является элементом переменной длины, а конечные пробелы игнорируются, что приводит к '%%%' в вышеуказанном случае и, таким образом, подбирает весь столбец.

Отредактировано для добавления: nchar или char, в этом случае не имеет значения. Если вы сейчас используете nchar, измените его на nvarchar.

+0

Изменил его на varchar, и все хорошо. В любом случае это, вероятно, лучше в долгосрочной перспективе. – Shawn

+0

Эй @ Шаун, бесстыдный плюс здесь, если бы мой ответ был тем, который сделал это для вас, вы думаете, что можете отметить его «Принято»? :-) Очень признателен! – Cyberherbalist

+0

Извините, попробовал, но должен был ждать и не возвращался до сих пор. Спасибо за помощь. – Shawn

4

Вот альтернатива, в результате чего значение по умолчанию параметра @ISTag в NULL

SELECT * 
FROM T_Computer 
WHERE (@ISTag IS NULL OR (ISTag LIKE '%' + @ISTag + '%')) 
AND Status <> 'Trashed' 
AND Status <> 'Sold' 
AND Status <> 'Stored' 
+0

Вы хотите «IS NULL» вместо «ISNULL» – LittleBobbyTables

+0

Спасибо, опечатка. Я починил это. –

0

ваша subsitute% знак того убежали? вы не получите то, что вы ожидаете, если поиск соответствует буквенному символу%.

Кроме того, нет необходимости использовать% для пустого поля. %% должен возвращать те же результаты, что и %%%.

-1

Проблема состоит в том, что два последовательных символа процента (%%) заставляют его соответствовать буквенному символу «%». Таким образом, 3 последовательных средних «соответствуют символу процента, а затем любые символы после этого».

Как указывает LittleBobby, не используйте «%» в качестве значения по умолчанию для значений NULL.

+0

Это неправда, насколько я могу судить. – lincolnk

+0

Экранирование подстановочных знаков в SQL выполняется с использованием предложения ESCAPE (ха-ха). Например.SELECT * FROM TT WHERE C LIKE 'e%' ESCAPE 'e'. Это ускользает от%, чтобы его можно было искать в столбце. Это означает, что если вам может понадобиться WHERE C LIKE '% e %%', если вы искали строки, в которых был знак процента. – Cyberherbalist

Смежные вопросы