我有一个用动态SQl编写的进程,用于我的一个应用程序。它用来搜索申请者的姓氏。目前,它正在搜索申请者的姓氏的前2位或全名。但我在搜索姓氏中有Apostrophe的申请者时遇到了问题(例如O‘’Connor)。如果客户端尝试搜索带有O‘或O’‘Connor的申请者,则会抛出错误。他们想搜索每个申请人,无论他们的姓氏中有没有Apostrophe。请帮帮我,我试了所有的方法,但都不起作用。下面是我的搜索代码,在流程中使用它来拉取申请者:
必要时添加通配符
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)发布于 2009-11-07 22:24:12
在构建SQL字符串时,需要对输入字符串中的撇号进行转义(基本上将一个‘替换为两个'')
无论您选择在何处将用户输入传递到SQL server数据库,都需要注意这一点,因为这是一个安全问题(SQL注入攻击)。Bobby Tables
if Rtrim(@LastName) <> ''
select @Where = @Where + ' and a.LastName like '+ Replace(Rtrim(@LastName),'''','''''') + ''发布于 2011-11-22 08:55:36
我的建议是编写查询,使其包含用于过滤的备用列,并将撇号/单引号替换为任何特殊字符,如#。这使您可以保持原始列不变,以防您想要显示它。
要在SQL Server中做到这一点,您可以这样做:
Select
tbl.strName_Last,
REPLACE(tblOrder.strName_Last, '''','#')) as StrLastNameForFilter
....然后将您的代码更改为基于此备用列进行筛选,并在用户提供的筛选字符串中,将撇号/单引号替换为特殊字符。
https://stackoverflow.com/questions/1693159
复制相似问题