2010-08-27 2 views
0

Я хочу написать хранимую процедуру, которая примет параметр @searchString. Это будет varchar (100) и будет содержать значение запроса. Как я могу написать зр так, что он может сделать что-то вроде:SQL 2005 - Строка поиска

SELECT * 
FROM Application a 
INNER JOIN Applicant app ON app.ApplicationId = a.ApplicationId 
WHERE a.ApplicationId = @searchString 
OR app.Name like '@searchString%' 
OR app.PostCode like '@searchString%' 

Проблема для меня в том, как справиться с тем, что SearchString может содержать идентификатор, который будет ИНТ или может быть значение строки.

+0

У вас есть какой-то способ передать что-то, чтобы указать, с какого поля оно должно выглядеть? Если это так, вы можете просто использовать оператор case в том месте. – spinon

+0

Мой план состоял в том, чтобы упростить интерфейс пользователя, просто используя 1 строку поиска, которая может использоваться для поиска по нескольким ключевым полям. –

ответ

0

Я решил эту проблему, создав еще одну локальную переменную, и если SearchString была числовой, преобразовать его, и если нет, то установите на ноль (идентификатор я не знаю, будет существовать).

declare @id int 
if ISNUMERIC(@searchString) = 1 
    set @id = CONVERT(int, @searchString) 
else 
    set @id = 0 

Тогда где положение выглядит следующим образом:

WHERE 
    a.ApplicationId = @id 
    OR app.Surname like @searchString + '%' 
    OR app.Forenames like '%' + @searchString + '%' 
0

Вы можете поместить выделение вместе в виде строки с правильным цитированием, а затем использовать sp_executesql для ее запуска.

Но имейте в виду, что есть потенциал для SQL-инъекции с этим!

0
You can check that searchString has only numbers by using PATINDEX and then only compare with applicationId 

SELECT * 
FROM Application a 
INNER JOIN Applicant app ON app.ApplicationId = a.ApplicationId 
WHERE (PATINDEX('%[^0-9]%', @searchString) = 0 AND a.ApplicationId = @searchString) 
OR app.Name like @searchString + '%' 
OR app.PostCode like '@searchString + '%' 
+0

Проблема заключается в том, что И после PATINDEX не является условным, поэтому вызывает ошибку преобразования –

0

Что о прохождении хранимая процедура входного параметра XML? Таким образом, когда вы «распакуете» XML, вы сможете контролировать типы данных и обрабатывать идентификаторы или текст в зависимости от ситуации.

0
SELECT * 
FROM Application a 
INNER JOIN Applicant app ON app.ApplicationId = a.ApplicationId 
WHERE a.ApplicationId = 
    case when ISNUMERIC(@searchString) 
    then 
    CONVERT(int, @searchString) 
    else 
    0 
    end 
OR app.Name like @searchString + '%' 
OR app.PostCode like @searchString + '%' 
0

Почему бы просто не наклеить ваш int как строку?

SELECT * 
FROM Application a 
INNER JOIN Applicant app ON app.ApplicationId = a.ApplicationId 
WHERE cast(a.ApplicationId as varchar(100)) = @searchString 
OR cast(app.Name as varchar(100)) like '@searchString%' 
OR cast(app.PostCode as varchar(100)) like '@searchString%' 
Смежные вопросы