Каков наилучший способ защитить динамический код t-sql, когда он поставляется в виде фильтров, использующих sp_executesql - PullRequest
0 голосов
/ 15 октября 2019

Я делаю хранимую процедуру, которая принимает динамическую фильтрацию, проблема в том, что мне нужно, чтобы она была максимально гибкой.

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 Ответ

0 голосов
/ 15 октября 2019

Пожалуйста, попробуйте ниже

    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;

Пожалуйста, дайте мне знать, если у вас есть какие-либо проблемы

Спасибо

...