【发布时间】: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