提问人:pixe 提问时间:10/15/2019 最后编辑:Zohar Peledpixe 更新时间:10/15/2019 访问量:88
当 t-sql 动态代码作为筛选器使用时,保护 t-sql 动态代码的最佳方法是什么sp_executesql
What is best way to secure t-sql dynamic code when it comes as filters using sp_executesql
问:
我正在制作一个接受动态过滤的存储过程,我遇到的问题是我需要尽可能保持它的灵活性。
ALTER PROCEDURE astp_test
@WhereClause NVARCHAR(max) = NULL
AS
DECLARE @FilteredResults AS TABLE (testId int, testfield datetime2)
DECLARE @sql AS NVARCHAR(MAX) = N'SELECT testId , testfield
FROM aviw_test
WHERE IsOpen = 1 AND IsLatesInsert = 1
AND testStepNo = 7
AND test2 IS NULL
AND (testfielddate IS NULL OR testfielddate2 < GETUTCDATE())
AND Domain IN (SELECT Domain FROM project WITH (NOLOCK) WHERE Status = ''Active'')' +
CASE WHEN @WhereClause IS NOT NULL
THEN N' AND ' + @WhereClause ELSE N''
END
INSERT INTO @FilteredResults
EXEC sys.sp_executesql @stmt = @sql;
我想保护输入,但以这种方式,因为有一些复选框会发送如下内容: .那么最好的方法是什么呢?@WhereClause
"AND testDatePick = '2019-10-10' AND testStage = 'InProgress' AND testArea = 'London' "
答:
-1赞
Madhu
10/15/2019
#1
请尝试以下操作
ALTER PROCEDURE astp_test
@WhereClause NVARCHAR(max) = NULL
AS
DECLARE @FilteredResults AS TABLE (testId int, testfield datetime2)
DECLARE @sql AS NVARCHAR(MAX) = N'SELECT testId , testfield
FROM aviw_test
WHERE IsOpen = 1 AND IsLatesInsert = 1
AND testStepNo = 7
AND test2 IS NULL
AND (testfielddate IS NULL OR testfielddate2 < GETUTCDATE())
AND Domain IN (SELECT Domain FROM project WITH (NOLOCK) WHERE Status = ''Active'')'
if @WhereClause is not null
set @sql=@sql + 'AND ' + @WhereClause
INSERT INTO @FilteredResults
EXEC sys.sp_executesql @stmt = @sql;
如果您有任何问题,请告诉我
谢谢
评论
@WhereClause
@sql
WITH (NOLOCK)
Status, Domain
QUOTENAME
WHERE
@WhereClause