SQL 2005-搜索字符串

SQL 2005-搜索字符串,sql,sql-server-2005,Sql,Sql Server 2005,我想编写一个接受@searchString参数的存储过程。这将是一个varchar100,并将包含一个查询值。如何编写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.PostC

我想编写一个接受@searchString参数的存储过程。这将是一个varchar100,并将包含一个查询值。如何编写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可能包含int或string值的Id这一事实。

您可以将select作为一个带有正确引号的字符串放在一起,然后使用来运行它


但是请注意,使用此工具有可能进行SQL注入

我通过创建另一个局部变量来解决这个问题,如果searchString是数字,则将其转换,如果不是,则将其设置为零,我知道将不存在一个id

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

向存储过程传递一个XML输入参数怎么样?这样,当您解压缩XML时,就可以控制数据类型,并根据需要处理ID或文本。

为什么不将int转换为字符串

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

您是否有某种方法来传递某个内容,以指示该内容应针对哪个字段?如果是这样的话,那么您可以在where中使用case语句。我的计划是通过使用一个搜索字符串来简化用户界面,该字符串可用于在几个关键字段之间进行搜索。问题是AND after PATINDEX不是有条件的,因此会导致转换错误