我应该避免在SQL中使用循环吗?

时间:2017-02-20 13:16:21

标签: sql sql-server

我创建了一个存储过程来处理这些表上的数据。

为了让我处理这些数据,我必须进行while循环,因为我必须计算一个表上没有的结束日期。

第一条记录的结束日期应该是第二条记录-1天的开始日期。

现在,当我向我的大四学生介绍时,他告诉我,在存储过程中使用循环是一个很大的问题。我的大四学生提供的解决方案是使用该表创建了一个视图,并在其上创建了多个联合以生成我需要的缺失数据。

我的循环方法是否错误?我将来不应该在我的存储过程中使用循环吗?

2 个答案:

答案 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 forumHow-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;
相关问题