根据存储过程参数更改SQL Server查询

时间:2019-01-10 21:29:55

标签: sql sql-server sql-server-2008 sql-server-2014

我有一个存储过程,其参数为@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 :(得分:1)

您需要为此使用dinamic 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;

答案 1 :(得分:0)

建议的解决方案:

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%'