Изменение запроса SQL Server на основе параметра хранимой процедуры - PullRequest
0 голосов
/ 11 января 2019

У меня есть хранимая процедура с параметром @FilterToUse.

У меня есть запрос внутри хранимой процедуры, как показано ниже:

INSERT INTO #StatusCalculation
    SELECT COUNT(*) 
    FROM Data  
    WHERE DataType = 'Bid' 
      --This part can change based on SP param       
      AND CreatedDate BETWEEN CONVERT(DATETIME, ('1/1' + '/' + @RequestYear))  
                          AND CONVERT(DATETIME, ('12/31' + '/' + @RequestYear))
      --end dynamic part
      AND Services LIKE '%Streamline Payroll%' 
      AND Services LIKE '%GlobalView Payroll%'

Так что, если у меня другой фильтр, мне нужно будет написать

 INSERT INTO #StatusCalculation
    SELECT COUNT(*) 
    FROM Data  
    WHERE DataType = 'Bid' 
      --This part can change based on param       
      AND BidId BETWEEN 1 AND 10
      --end dynamic part
      AND Services LIKE '%Streamline Payroll%' 
      AND Services LIKE '%GlobalView Payroll%'

Теперь моя проблема в том, что на основе параметра @FilterToUse мне, возможно, придется использовать другое выражение запроса. Один и тот же запрос, основанный на разных параметрах, используется около 10 раз. Есть ли способ, которым я могу динамически добавлять условия фильтра в запрос на основе параметра, не дублируя весь запрос.

Я подумал, смогу ли я как-нибудь сделать следующее

declare @data nvarchar(max)
Set @data = 'and CreatedDate between convert(datetime,("1/1"+"/"+@RequestYear))  
    and convert(datetime,("12/31"+"/"+@RequestYear))'

, а затем просто добавьте эту переменную в запрос

Insert into #BidStatusCalculation
    select 'SL Payroll',Count(*) from DashboardData
    where DataType = 'Bid'
    @data

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Для этого вам нужно использовать динамический SQL. Сначала определите и назначьте @DinamicPart, но вы можете включить это в вызов SP и рассматривать как параметр.

DECLARE @DinamicPart AS NVARCHAR(MAX), -- This is the part that will be passed as parameter to the SP
        @SQL         AS NVARCHAR(MAX);
SET @DinamicPart = ' AND CreatedDate BETWEEN CONVERT(DATETIME, (''1/1/' + @RequestYear+'))  
                          AND CONVERT(DATETIME, (''12/31/' + @RequestYear))';
SET @SQL = 'INSERT INTO #StatusCalculation
    SELECT COUNT(*) 
    FROM Data  
    WHERE DataType = 'Bid' 
      --This part can change based on SP param       ' +
     @DinamicPart + '     
      --end dynamic part
      AND Services LIKE ''%Streamline Payroll%'' 
      AND Services LIKE ''%GlobalView Payroll%'';
-- This part if for debugging purposes as Dinamic SQL can be very tricky
PRINT @SQL;
-- And last part, you run the Dinamic SQL
EXEC SP_ExecuteSQL @SQL;
0 голосов
/ 11 января 2019

Предлагаемое решение:

insert into #StatusCalculation
select COUNT(*)
from Data
where DataType = 'Bid'
    --This part can change based on param       
    and 1 = (
    case @FilterToUse
        when 1 then
            case when year(CreateDate) = @RequestYear then 1 else 0 end
        when 2 then
            case when BidId between 1 and 10 then 1 else 0 end
    end
    )
    --end dynamic part
    and Services like '%Streamline Payroll%'
    and Services like '%GlobalView Payroll%'
...