2010-08-27 102 views
0

我想编写一个接受@searchString参数的存储过程。这将是一个varchar(100)并将包含一个查询值。我怎么能写SP,以便它可以这样做: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%' 

这个问题对我来说是如何处理的事实,搜索字符串可以包含一个标识,这将是一个int或可能是一个字符串值。

+0

你有什么方法可以传递某些东西来表明它应该反对什么字段?如果是这样,那么你可以在where中使用case语句。 – spinon 2010-08-27 08:54:52

+0

我的计划是通过只有一个搜索字符串可以用于搜索几个关键字段来简化用户界面 – 2010-08-27 09:17:12

回答

0

我解决了这个创造另一个局部变量,如果搜索字符串是数字,将其转换,如果没有设置为零(我知道一个ID将不存在)。

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

然后where子句中的样子:

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之后的AND不是有条件的,因此会导致转换错误 – 2010-08-27 09:30:45

0

关于通过存储的过程的XML输入参数是什么?这样,当你“解压缩”XML时,你将能够控制数据类型并适当地处理ID或文本。

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%'