【问题标题】:SET DATEFIRST CURSOR WHILE LOOP Error - set options have changedSET DATEFIRST CURSOR WHILE LOOP 错误 - 设置选项已更改
【发布时间】:2018-11-21 14:06:13
【问题描述】:

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

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

现在,如果我运行它,我会到达 CURSOR 的第二行,它会崩溃并显示状态;

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)

类似的东西。

【问题讨论】:

  • OPEN 计划更改为 OPEN CursorTest
  • 我知道这只是一个错字,仍然会崩溃......
  • 你为什么要用cursor做这个?看起来您可以通过简单的基于集合的查询和 case 表达式来实现这一点?
  • 我正在使用游标,因为我要从一个表中提取 15000 行,并且每行需要将 50 行插入到另一个表中。这是一个很大的脚本。
  • 750,000 行并不多。也许问另一个问题以寻求有关如何实现 insert 的帮助,并将此问题留给需要在 cursor 中更改 datefirst 属性的任何人。

标签: sql-server date while-loop cursor


【解决方案1】:

你可以移动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

【讨论】:

    【解决方案2】:

    我修好了;

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多