Sql server 循环错误时设置DATEFIRST游标-设置选项已更改

Sql server 循环错误时设置DATEFIRST游标-设置选项已更改,sql-server,date,while-loop,cursor,Sql Server,Date,While Loop,Cursor,我的光标循环有非常奇怪的行为,这就是我得到的 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

我的光标循环有非常奇怪的行为,这就是我得到的

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)

沿着这些线的东西。

你可以移动
设置

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
我把它修好了

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

打开时间表更改为打开游标我知道这只是一个输入错误,仍然会崩溃…为什么要用
游标来执行此操作?看起来您可以通过一个简单的基于集合的查询和一个
case
表达式来实现这一点?我使用游标是因为我要从一个表中提取15000行,每行需要转到另一个表中并插入50行。这是一个很大的脚本。750000行没有那么多。关于如何实现
插入
的问题,请询问另一个问题以寻求帮助,并将此问题留给需要更改
光标
中的
日期优先
属性的任何人。