Sql 将光标与CTE一起使用

Sql 将光标与CTE一起使用,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,下面的查询需要一个游标,这样我就可以循环获取/更新/插入一些其他数据。有人能帮我吗 DECLARE @FROMDATE DATETIME DECLARE @TODATE DATETIME SELECT @FROMDATE = Getdate() SELECT @TODATE = Getdate() + 7 ;WITH DATEINFO(DATES) AS (SELECT @FROMDATE UNION ALL SELECT DATES + 1

下面的查询需要一个游标,这样我就可以循环获取/更新/插入一些其他数据。有人能帮我吗

DECLARE @FROMDATE DATETIME
DECLARE @TODATE DATETIME
SELECT @FROMDATE = Getdate()
SELECT @TODATE = Getdate() + 7

;WITH DATEINFO(DATES)
     AS (SELECT @FROMDATE
         UNION ALL
         SELECT DATES + 1
         FROM   DATEINFO
         WHERE  DATES < @TODATE)
SELECT *
FROM   DATEINFO
OPTION (MAXRECURSION 0)
我尝试了很多方法,但都没有找到有效的方法

我正在使用

declare @adate datetime
DECLARE @FROMDATE DATETIME 
DECLARE @TODATE DATETIME 
select @FROMDATE=getdate()
select @TODATE =getdate()+7

declare @weekdates cursor for
WITH DATEINFO(DATES) AS (SELECT @FROMDATE UNION ALL SELECT DATES + 1 FROM DATEINFO WHERE DATES < @TODATE) 
SELECT * FROM DATEINFO OPTION (MAXRECURSION 0)

open @weekdates
fetch next from @weekdates into @adate
while @@fetch_status=0
begin
print 'success'
fetch next from @weekdates into @adate
end
close @weekdates
deallocate @weekdates

我仍然会遇到错误

只需将其放在公共表表达式之前:

DECLARE @FROMDATE DATETIME 
DECLARE @TODATE DATETIME 
select @FROMDATE=getdate()
select @TODATE =getdate()+7

declare boris cursor for

WITH DATEINFO(DATES)
     AS (SELECT @FROMDATE
         UNION ALL
         SELECT DATES + 1
         FROM   DATEINFO
         WHERE  DATES < @TODATE)
SELECT *
FROM   DATEINFO
OPTION (MAXRECURSION 0) 
然而,插入关于光标几乎总是工作的错误工具的常见警告。如果您能找到一种方法以基于集合的方式完成整个操作,那么它通常更可取,而且可能会执行得更好,或者至少更易于进行性能调整

在游标名称中使用@是可以的,但您使用的语法是错误的

DECLARE @adate DATETIME
DECLARE @FROMDATE DATETIME
DECLARE @TODATE DATETIME

SELECT @FROMDATE = getdate()

SELECT @TODATE = getdate() + 7

DECLARE @weekdates CURSOR;

SET @weekdates = CURSOR FOR
WITH DATEINFO(DATES)
     AS (SELECT @FROMDATE
         UNION ALL
         SELECT DATES + 1
         FROM   DATEINFO
         WHERE  DATES < @TODATE)
SELECT *
FROM   DATEINFO
OPTION (MAXRECURSION 0) 

OPEN @weekdates

FETCH next FROM @weekdates INTO @adate

WHILE @@fetch_status = 0
  BEGIN
      PRINT 'success'

      FETCH next FROM @weekdates INTO @adate
  END

当声明为局部@变量时,当变量超出范围时,游标将自动关闭并释放。

我敢问你为什么称游标为boris吗-@桥-对不起,习惯的力量。我似乎永远也找不出一个合适的游标名称——它们要么是通过阅读平凡的select语句来理解的微不足道的名称,要么是非常复杂的名称,以至于在试图描述它们时会突破sysname的限制。所以在我的字典里他们的名字叫鲍里斯code@user1776417它抛出了什么错误?你真的复制粘贴了吗?你记得去掉分号吗?完成后请记住关闭并解除分配boris。游标变量可以以@开头,在这种情况下,当它们超出范围时,会自动关闭并解除分配。将声明更改为声明@boris Cursor;将@boris=光标设置为。。。对于此+100-当声明为局部@变量时,当变量超出范围时,光标将自动关闭并解除分配。-作为一名长期的MS SQL开发人员,我还是个新手-谢谢!