我创建了一个proc,它将按姓氏返回申请人列表。我在搜索具有撇号的姓氏的申请人时遇到问题(示例O'Connor)。能否帮助找到这些申请人:
以下是我的搜索代码:
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
#At the end - --Now build dinamically the filter base on input parameters
if Rtrim(@FirstName) <> ''
select @Where = @Where + ' and a.FirstName like '+ Rtrim(@FirstName)
if Rtrim(@LastName) <> ''
select @Where = @Where + ' and a.LastName like '+ Rtrim(@LastName)
答案 0 :(得分:2)
使用双撇号在T-SQL字符串中转义撇号,例如
SELECT * FROM sometable where LastName LIKE '%''%'
请注意,由于SQL injection attacks的风险,组合来自可能包含撇号的字符串的动态SQL语句的组合非常很危险。普通用户可能有像O'Connor这样的名字,但精明的攻击者可能会选择像"O'; TRUNCATE TABLE Customers; --"
这样可能会删除数据的“名称”。
至少,如果你是从字符串动态组装SQL语句,你应该在将该字符串注入SQL之前用双撇号(例如REPLACE (@LastName, '''', '''''')
)替换撇号。
但是,如果这些字符串来自用户,您应该考虑使用参数化查询,而不是通过字符串连接与SQL和参数字符串手动组装SQL查询。参数化意味着SQL客户端API和/或服务器负责将参数转换为“安全”字符串。这是针对SQL注入攻击的最佳防御。有关详细信息,请查看此Jeff Atwood blog post。
答案 1 :(得分:2)
您的代码看起来像是尝试构建动态SQL WHERE
子句。把它停在那里扔掉它,你的方法是危险的,容易出错。
您可能希望按照以下方式执行某些操作:
/* declare a few test variables */
DECLARE @FirstName varchar(30)
DECLARE @LastName varchar(60)
SET @FirstName = 'First''Name'
SET @LastName = 'Last''Name'
/* these variables are for dynamic SQL execution */
DECLARE @IntVariable int
DECLARE @SQLString nvarchar(500)
DECLARE @ParmDefinition nvarchar(500)
/* define a paramertized SQL query */
SET @SQLString =
N'SELECT
UserId
FROM
UserTable
WHERE
LastName LIKE ''%'' + @ln + ''%''
AND FirstName LIKE ''%'' + @fn + ''%''
'
/* define the used parameters and their types */
SET @ParmDefinition = N'@ln varchar(30), @fn varchar(60)'
/* execute dynamic SQL, syntax- and code-injection safely */
EXECUTE sp_executesql @SQLString, @ParmDefinition,
@ln = @LastName, @fn = @FirstName
请务必阅读MSDN on sp_executesql
以获取更多解释&amp;样品
答案 2 :(得分:0)
类似的东西:
...
select @Where = @Where + ' and a.LastName like ' + Replace(Rtrim(@LastName), '''', '''''')
...
(是的,我知道,这些都是很多引号,但它有效。)
并且中需要更多引号,例如'x'语法:
select @Where = @Where + ' and a.LastName like ''' + Replace(Rtrim(@LastName), '''', '''''') + ''''
(是的,越来越多的报价)
这将生成正确的:
and a.LastName 'like o''conor'