我正在使用这样的查询:
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
由一个程序填充。
如果程序返回一个包含单引号的字符串存储过程错误,我该如何处理呢?
如果可能,我希望由存储过程处理,而不是传入字符串的程序。
答案 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