动态SQL存储过程中的单引号处理

时间:2017-04-21 08:00:44

标签: sql sql-server tsql sql-server-2012

我正在使用这样的查询:

ALTER procedure [dbo].[procedure]
@Search nvarchar(100) = ''
declare @LargeComplexQuery nvarchar(max) =
'select * from People where Name like ''%' + @Search + '% order by Name'
exec sys.sp_executesql @LargeComplexQuery

@Search由一个程序填充。 如果程序返回一个包含单引号的字符串存储过程错误,我该如何处理呢?

如果可能,我希望由存储过程处理,而不是传入字符串的程序。

3 个答案:

答案 0 :(得分:4)

在传递参数之前转义应用程序中的引用,或者在proc:

中执行
1

答案 1 :(得分:3)

你应该在恢复价值后逃避报价 如果传递COALESCE以避免出现以下错误

,还会NULL参数
EXEC sp_executesql NULL

哪个会给出

  

过程需要参数'@statement'的类型   'NTEXT / NCHAR / nvarchar的'。

其中给出以下陈述

DECLARE @Search nvarchar(100) = '';
SET @Search = REPLACE(COALESCE(@Search, ''), '''', '''''');
SET @LargeComplexQuery = 'SELECT * FROM People WHERE Name LIKE ''%' + @Search + '%'''
EXEC sys.sp_executesql @LargeComplexQuery

答案 2 :(得分:2)

这里作为使用sp_executesql参数的版本,因此不容易受到SQL注入攻击 - 它也应该提供更好的性能,引用MSDN:

  

因为Transact-SQL语句本身只保持不变   参数值更改,SQL Server查询优化器很可能   重用它为第一次执行生成的执行计划。

CREATE PROCEDURE [dbo].[Yourproc]
(
  @Search NVARCHAR(100) = N''
)
AS
    DECLARE @LargeComplexQuery NVARCHAR(MAX) = 'SELECT * from People WHERE Name LIKE ''%'' + COALESCE(@Search, '''') + ''%'' ORDER BY Name'
    EXEC sys.sp_executesql @LargeComplexQuery, N'@Search NVARCHAR(100)', @Search = @Search

我做了一些假设,例如如果你传递空字符串或NULL作为搜索条件,那么你就会让所有人都返回。

测试它 - 虚拟架构&数据:

CREATE TABLE People(Name NVARCHAR(MAX))

INSERT INTO People(Name)
VALUES ('Mr Smith'), ('Mrs Jones'), ('Miss O'' Jones')

测试存储过程执行:

DECLARE @search NVARCHAR(100) = N'Jones';
EXEC YourProc @Search; --Should get back both Mrs Jones and Miss O'Jones
SET @search  = N'O'' Jones';
EXEC YourProc @Search; --Should get back just Miss O'Jones 
SET @search  = N'';
EXEC YourProc @Search; --Should get everyone, same as if you passed no search value at all
SET @search = NULL
EXEC YourProc @Search; --Should get everyone

MSDN Documentation on sp_executesql