SET DATEFIRST CURSOR WHILE LOOP Ошибка - установленные параметры изменены - PullRequest
0 голосов
/ 12 июня 2018

У меня очень странное поведение с моим циклом курсора, вот что я получил;

DECLARE @StartDate AS DATE
DECLARE @ID INT
DECLARE CursorTest CURSOR FOR  
SELECT ID FROM tblSomething

OPEN Schedule
FETCH NEXT FROM CursorTest INTO @ID

WHILE @@FETCH_STATUS = 0
    BEGIN
        SELECT @StartDate = StartDate FROM tblAnother WHERE ID = @ID
        SELECT @StartDate --12/06/2018
        -- NOW WE MOD IT
        SET DATEFIRST 6 -- WE START ON SATURDAY 1
        SET @StartDate = DATEPART(dw,@StartDate)
        SELECT @StartDate -- ANSWER IS 4
        FETCH NEXT FROM CursorTest INTO @ID
    END

CLOSE CursorTest
DEALLOCATE CursorTest

Теперь, если я запустил это, я попаду во второй ряд на курсоре, и он будет аварийно завершать свою работу;

Could not complete cursor operation because the set options have changed since the cursor was declared.

Теперь, если я закомментирую;

--SET DATEFIRST 6

Ошибка исчезнет, ​​поэтому я думаю, что SET DATEFIRST изменяет базу данных, которая вызывает ошибку.

Есть ли что-то вроде этого;

SET @StartDate = DATEPART(dw,@StartDate,DATEFIRST 6)

Что-то в этом роде.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Я это исправил;

SET DATEFIRST 6 -- outside CURSOR LOOP;
WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @StartWeek = DATEPART(wk,@StartDate) -- CORRECT BY DATEFIRST 6
        SET @StartDay = (DATEPART(dw,@StartDate) + @@DATEFIRST - 1 - 1) % 7 + 1 -- MONDAY 1
    END
0 голосов
/ 12 июня 2018

Вы можете двигаться SET:

DECLARE @StartDate AS DATE
DECLARE @ID INT
DECLARE CursorTest CURSOR FOR  
SELECT ID FROM tblSomething

SET DATEFIRST 6 -- WE START ON SATURDAY 1

OPEN Schedule
FETCH NEXT FROM CursorTest INTO @ID

WHILE @@FETCH_STATUS = 0
    BEGIN
        SELECT @StartDate = StartDate FROM tblAnother WHERE ID = @ID
        SELECT @StartDate --12/06/2018
        -- NOW WE MOD IT

        SET @StartDate = DATEPART(dw,@StartDate)
        SELECT @StartDate -- ANSWER IS 4
        FETCH NEXT FROM CursorTest INTO @ID
    END

CLOSE CursorTest
DEALLOCATE CursorTest
...