【问题标题】:Whats an alternative to using a cursor as per this example in t-sql根据 t-sql 中的此示例使用游标的替代方法是什么
【发布时间】:2012-12-06 11:23:06
【问题描述】:

我是 SQL 新手(特别是 t-sql 和 microsoft SQL Server 2008 R2),遇到了一个问题,我的老板建议我使用游标来解决。问题在于获取超过一小时(但可被一小时整除)的记录(相当于输入轮班)并将它们有效地拆分为多个一小时的轮班记录,以生成报告。

您可以在下面看到查​​询部分是我使用的游标逻辑。我的理解是游标效率非常低,而且令人不快——但我的老板和我自己都无法找到解决这个问题的替代方案。

任何人都可以演示我们可以在没有光标的情况下执行此操作的方法吗?

Open Curs;

 FETCH NEXT FROM Curs INTO @ClientID, @RDNSID, @SvceType, @SDate, @ClientNm, @CHours, @StaffNm, @Package

WHILE (@@Fetch_Status = 0)
BEGIN
      SET @Hour = 60
      SET @Num = @Chours
    IF (@Num % 60 = 0)
            BEGIN
                  WHILE (@Num >= 60)
                  BEGIN
                        INSERT INTO #ASRTable VALUES (@ClientID, @RDNSID, @SvceType, @SDate, @ClientNm, @Hour, @StaffNm, @Package)
                        SET @Num = @Num - 60
                        SET @SDate = DATEADD(HH, 1, @SDate)
                  END
            END

      ELSE
            BEGIN
                  SET @Hour = 'INVALID SHIFT'
                  INSERT INTO #ASRTable VALUES (@ClientID, @RDNSID, @SvceType, @SDate, @ClientNm, @Hour, @StaffNm, @Package)
            END

      FETCH NEXT FROM Curs INTO @ClientID, @RDNSID, @SvceType, @SDate, @ClientNm, @CHours, @StaffNm, @Package
END


SELECT * FROM #ASRTable

DROP TABLE #ASRTable   

CLOSE Curs
DEALLOCATE Curs

【问题讨论】:

  • 好吧,您已经设法省略最有趣的部分 - 光标定义 .... (DECLARE CURSOR Curs FOR ......)。另外,你能用简单的英语解释这段代码应该做什么吗?这通常对了解正在发生的事情很有帮助......

标签: tsql sql-server-2008-r2 cursor


【解决方案1】:

嗯,你没有给我们样本数据或预期结果,但我认为这遵循相同的逻辑:

declare @t table (
    SDate datetime not null,
    Chours int not null --Curiously, will store a number of minutes?
)

insert into @t (SDate,Chours) values ('2012-12-19T10:30:00',120),('2012-12-18T09:00:00',60),('2012-12-17T08:00:00',90)

;with shifts as (
    select SDate,Chours,'60' as Hour from @t where Chours % 60 = 0
    union all
    select DATEADD(hour,1,SDate),CHours - 60,'60' from shifts where Chours > 0
)
select SDate,Hour from shifts
union all
select SDate,'Invalid Shift' from @t where CHours % 60 <> 0

结果:

SDate                   Hour
----------------------- -------------
2012-12-19 10:30:00.000 60
2012-12-18 09:00:00.000 60
2012-12-18 10:00:00.000 60
2012-12-19 11:30:00.000 60
2012-12-19 12:30:00.000 60
2012-12-17 08:00:00.000 Invalid Shift

当然,我没有你所有的其他专栏,因为我不知道它们是什么意思。

【讨论】:

  • 谢谢大家-下次我会在回答中提供更多信息。感谢 Damien 的示例 - 会给它一个错误!
猜你喜欢
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 2012-03-15
  • 2018-07-25
  • 1970-01-01
相关资源
最近更新 更多