我正在尝试编写一个存储过程,其中where子句需要基于传递给过程的参数是动态的。
根据是否将空字符串传递给StartDate和EndDate,ContractDate条件选择行。如果它们是空字符串,则用户将传递日期列表(假设),并且我需要选择具有与列表中的那些相同的ContractDates的行。如果@StartDate和@EndDate参数不是空字符串,我选择具有ContractDate> = @StartDate和< = @EndDate的行。我将如何将其纳入我的过程中?当前代码导致语法错误。
select TermDescription,ContractDate,Price,SortOrder into #tbtp from BaseTermPrice
inner hash join Term
on
Term.TermID = BaseTermPrice.TermID
where
BaseID = @BaseID and PeakType = @PeakType and
case when @StartDate != '' and @EndDate != ''
then
ContractDate >= @StartDate and ContractDate <= @EndDate
else
ContractDate in (@DateList)
end
order by
ContractDate,SortOrder
答案 0 :(得分:0)
您应该查看动态SQL。最好的起点是http://www.sommarskog.se/dynamic_sql.html。动态SQL允许您根据所需的任何条件以编程方式构建SQL字符串。
答案 1 :(得分:0)
您也可以在没有动态SQL的情况下完成它。我不想用它来避免只能在运行时发现的语法错误。
您需要将过程重构为仅包含完整SQL语句的IF块,而不是片段。
对于@DateList变量:
答案 2 :(得分:0)
感谢您提出的所有宝贵建议。最后用ands和ors来解决这个问题
select TermDescription,ContractDate,Price,SortOrder into #tbtp from BaseTermPrice
inner hash join Term
on
Term.TermID = BaseTermPrice.TermID
where
BaseID = @BaseID and ((@PeakType IS NULL and PeakType is null) or (@PeakType IS NOT NULL and PeakType=@PeakType))
and ((@DateList IS NULL and ContractDate between @StartDate and @EndDate) or (@StartDate IS NULL and ContractDate in (@DateList)))
order by
ContractDate,SortOrder