我创建了一个存储过程来处理这些表上的数据。
为了让我处理这些数据,我必须进行while
循环,因为我必须计算一个表上没有的结束日期。
第一条记录的结束日期应该是第二条记录-1天的开始日期。
现在,当我向我的大四学生介绍时,他告诉我,在存储过程中使用循环是一个很大的问题。我的大四学生提供的解决方案是使用该表创建了一个视图,并在其上创建了多个联合以生成我需要的缺失数据。
我的循环方法是否错误?我将来不应该在我的存储过程中使用循环吗?
答案 0 :(得分:1)
在处理可能需要循环的问题时,使用基于集合的方法总是一个好主意。
几乎总是你的while / for循环可以与Conditional JOIN交换以使其基于设置。如果它是您需要的计数器,请尝试使用计数表。
使用JOIN转换为Set问题的循环示例如下所示
SELECT DISTINCT A.StartDate, B.EndDate
FROM
A LEFT JOIN B
ON DATEDIFF(d,A.EndDate,B.StartDate)=1
答案 1 :(得分:1)
最好包括您的代码,以及样本数据来说明您的情况,并使用给定样本数据的样本结果集描述您想要的结果。请参阅:How to post a tsql question on a public forum和How-to-Ask。
几乎总是更好,以避免任何类型的dataTable: [['Date', 'Low', 'Open', 'Close', 'High', {role: 'tooltip', p: {html: true}}]]
或while
。在您描述的情况下,我相信您可以通过利用lead()
窗口函数来避免cursor
循环或多个while
查询。
使用带有lead()
的common table expression的示例:
union
在派生表/内联视图中使用lead()
的示例:
;with cte as (
select t.*
, NextStartDate = lead(StartDate) over (
partition by ForEachOfThisColumn -- e.g. AccountId, AssignmentId
order by StartDate asc
)
from t
)
select cte.*
, EndDate = dateadd(day, -1, NextStartDate)
from cte;