我有一个存储过程,其参数为@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
答案 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%'