Tsql 在t-sql中使用游标的替代方法是什么
我是SQL新手(特别是t-SQL和microsoft SQL Server 2008 R2),有一个问题我的老板建议我用光标来解决。问题在于获取超过一小时(但可被一小时整除)的记录(相当于输入到名册中的班次),并有效地将其拆分为多个每个小时的班次记录以生成报告 下面您可以看到我使用的游标逻辑的查询部分。我的理解是,游标效率很低,不受欢迎——但我的老板和我自己都无法找到解决这个问题的替代方案 有人能演示一种不用光标的方法吗Tsql 在t-sql中使用游标的替代方法是什么,tsql,sql-server-2008-r2,cursor,Tsql,Sql Server 2008 R2,Cursor,我是SQL新手(特别是t-SQL和microsoft SQL Server 2008 R2),有一个问题我的老板建议我用光标来解决。问题在于获取超过一小时(但可被一小时整除)的记录(相当于输入到名册中的班次),并有效地将其拆分为多个每个小时的班次记录以生成报告 下面您可以看到我使用的游标逻辑的查询部分。我的理解是,游标效率很低,不受欢迎——但我的老板和我自己都无法找到解决这个问题的替代方案 有人能演示一种不用光标的方法吗 Open Curs; FETCH NEXT FROM Curs INT
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 @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
当然,我没有你所有的其他专栏,因为我不知道它们是什么。好吧,你已经设法省略了最有趣的部分——光标定义。。。。(
为……声明游标游标游标)。另外,你能用简单的英语解释一下这个代码应该做什么吗?这通常对理解正在发生的事情很有帮助…谢谢各位-下次我将在回答中提供更多信息。谢谢你的例子Damien-将给它一个berl!
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