撇号问题

时间:2009-11-07 14:16:49

标签: sql-server-2000 apostrophe

我有一个在Dynamic SQl中为我的一个应用程序编码的Proc。它用于搜索申请人的姓氏。现在,它正在搜索申请人的姓氏或姓氏的前两位数字。但我在查找姓氏为撇号的申请人时遇到问题(示例O'Connor)。如果客户试图用O'或O'Connor搜索申请人,则会抛出错误。他们希望在姓氏中搜索有或没有Apostrophe的每个申请人。请帮助我尝试了一切,但它无法正常工作。以下是我在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)

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

我的建议是编写查询以包含用于过滤的备用列,其中撇号/单引号被任何特殊字符(例如#)替换。这样您就可以保留原始列的完整性,以防您想要显示它。

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

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

然后根据此备用列更改您的代码以进行过滤,并在用户提供的过滤字符串中,用特殊字符替换撇号/单引号。