私は SQL (具体的には t-sql と microsoft SQL Server 2008 R2) を初めて使用し、上司からカーソルを使用して修正するように勧められた問題がありました。問題は、1 時間を超える (ただし、1 時間で割り切れる) 記録 (名簿に入力されたシフトに等しい) を取得し、それらをレポート用にそれぞれ 1 時間の複数のシフト記録に効果的に分割することです。
以下に、使用したカーソル ロジックに関するクエリのセクションを示します。私の理解では、カーソルは非常に非効率的であり、眉をひそめていますが、私の上司も私も、この問題に対する代替ソリューションを特定できませんでした.
カーソルなしでこれを行う方法を誰かが実証できますか?
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