SQL Server Express 2008 R2 - квадратные скобки в текстовом поле не возвращают результаты - PullRequest
0 голосов
/ 18 декабря 2010

Я создал простую хранимую процедуру с некоторыми значениями по умолчанию, чтобы включить настраиваемый поиск в моей базе данных "MachineModel".

Как часть предложения WHERE, у меня есть что-то вроде этого:

Model.[ModelName] LIKE '%' + ISNULL(@ModelName, Model.[ModelName]) + '%' 

, что должно учитывать частичные совпадения. Это работает для большинства моделей, однако, если не указано значение для @ModelName (и, следовательно, ISNULL разрешается в Model. [ModelName]), а данные базового поля содержат квадратные скобки, такие как «Тестовая модель Ленни [2010]», тогда эти записи не возвращаются SProc.

Это не большая проблема, поскольку только 4 модели (из 120 000) имеют квадратные скобки в именах, поэтому я могу легко их поменять, однако мне любопытно узнать, что происходит и как лучше всего решить эту проблему. это.

Приветствия

Ленни.

Ответы [ 2 ]

3 голосов
/ 18 декабря 2010

Вам необходимо заменить ведущую скобу на [[]

В LIKE есть 3 символа со значением: % _ [. Вам не нужно выходить за скобки.

Для полноты:

Model.[ModelName] LIKE '%' + ISNULL(
    --don't do it the other way around!
    REPLACE(REPLACE(REPLACE(@ModelName, '[', '[[]), '%', '[%]), '_', '[_]),
    Model.[ModelName]) + '%'
1 голос
/ 18 декабря 2010

Почему вы сравниваете модель с самим собой в случае нулевого параметра поиска?Это дорого.

Не очень хорошая практика смешивать и то и иное с SQL Server, поскольку это дорого, но это можно сделать:

Where (
 @ModelName is null OR
 (ModelName is not null AND ModelName LIKE '%' + @ModelName + '%')
)

если производительность может быть проблемой, товведение if может помочь, но вы в конечном итоге продублируете свой выбор

if @ModelName is null 
 select * from ...
else
 select ...
 where ModelName LIKE '%' + @ModelName + '%'

Вы могли бы, но это расстроит ваш dba, создаст sql в коде и будет использовать sqlparameters и только добавит where, когда этот varне равно нулю

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