Использование курсора с CTE
Мне нужен курсор для нижеследующего запроса, поэтому я могу выполнить цикл, чтобы получить/обновить/вставить некоторые другие данные. Может ли кто-нибудь помочь мне с этим?
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
Тем не менее я получаю ошибки
Ответы
Ответ 1
Просто введите его перед общим табличным выражением:
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)
(Тем не менее, вставляйте обычные предостережения о курсорах, которые почти всегда являются неправильным инструментом для задания. Если вы можете найти способ выполнить всю операцию на основе набора, это обычно предпочтительнее и, вероятно, будет лучше (или на менее всего подходит для настройки производительности))
Ответ 2
Хорошо использовать @
в имени курсора, но используемый вами синтаксис неверен.
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
При объявлении как локальной переменной @
курсор автоматически закрывается и освобождается, когда переменная выходит за пределы области видимости.