我有一个在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)
答案 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
....
然后根据此备用列更改您的代码以进行过滤,并在用户提供的过滤字符串中,用特殊字符替换撇号/单引号。