0

我有一个在 Dynamic SQl 中为我的一个应用程序编码的 Proc。它用于搜索申请人的姓氏。现在,它正在搜索申请人的姓氏的前 2 位数字或全名。但是我在搜索姓氏中有撇号的申请人时遇到问题(例如 O'Connor)。如果客户尝试使用 O' 或 O'Connor 搜索申请人,则会引发错误。他们希望搜索姓氏中带有或不带有撇号的每个申请人。请帮助我尝试了一切,但它不起作用。以下是我在 Proc 中用于拉申请人的搜索代码:

必要时添加通配符

if Rtrim(@FirstName) <> ''
begin 
  If(Len(@FirstName) < 30) and (CharIndex('%', @FirstName) = 0) and @FirstName != ''
         Set @FirstName = char(39) + @FirstName + '%' + char(39)
end 

if Rtrim(@LastName) <> ''
begin 
   If(Len(@LastName) < 60) and (CharIndex('%', @LastName) = 0) and @LastName != ''
     Set @LastName = Char(39) + @LastName + '%' + char(39)
end

现在根据输入参数动态构建过滤器

if Rtrim(@LastName) <> ''
 select @Where = @Where + ' and a.LastName like '+ Rtrim(@LastName)
4

2 回答 2

3

在构建 SQL 字符串时,您需要转义输入字符串中的撇号(基本上用两个 '' 替换单个 ')

在您选择将用户输入传递到 SQL 服务器数据库的任何地方都需要注意这一点,因为它是一个安全问题(SQL 注入攻击)cf Bobby Tables

if Rtrim(@LastName) <> ''
 select @Where = @Where + ' and a.LastName like '+ Replace(Rtrim(@LastName),'''','''''') + ''
于 2009-11-07T14:24:11.800 回答
0

我的建议是编写查询以包含用于过滤的备用列,将撇号/单引号替换为任何特殊字符,例如 #。这允许您保留原始列,以备不时之需。

要在 SQL Server 中执行此操作,您可以执行以下操作:

Select
    tbl.strName_Last,
    REPLACE(tblOrder.strName_Last, '''','#')) as StrLastNameForFilter
  ....

然后将代码更改为基于此备用列进行过滤,并在用户提供的过滤器字符串中,将撇号/单引号替换为特殊字符。

于 2011-11-22T00:55:35.733 回答