T-SQL在where子句中存储了proc条件

时间:2014-04-17 20:03:27

标签: sql sql-server

我正在尝试编写一个存储过程,其中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

3 个答案:

答案 0 :(得分:0)

您应该查看动态SQL。最好的起点是http://www.sommarskog.se/dynamic_sql.html。动态SQL允许您根据所需的任何条件以编程方式构建SQL字符串。

答案 1 :(得分:0)

您也可以在没有动态SQL的情况下完成它。我不想用它来避免只能在运行时发现的语法错误。

您需要将过程重构为仅包含完整SQL语句的IF块,而不是片段。

对于@DateList变量:

  1. 将@DateList变量解析为临时表#DateListTable。请参阅此处的热门答案 How Do I Split a Delimited String in SQL Server Without Creating a Function?
  2. 将相关SQL更改为ContractDate(从#DateListTable中选择ContractDate)

答案 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