SQL 2005 - строка поиска - PullRequest
       3

SQL 2005 - строка поиска

0 голосов
/ 27 августа 2010

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

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 может содержать Id, который будет int или может быть строковым значением.

Ответы [ 6 ]

0 голосов
/ 17 января 2014

Почему бы просто не привести ваш 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%'
0 голосов
/ 31 августа 2010
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 голосов
/ 27 августа 2010

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

0 голосов
/ 27 августа 2010

Я решил эту проблему, создав другую локальную переменную и, если 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 голосов
/ 27 августа 2010
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 голосов
/ 27 августа 2010

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

Но имейте в виду, что с этим можно внедрить SQL-код!

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