Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Использование динамического курсора.  [new]
Мордор Держимордов
Member

Откуда:
Сообщений: 953
Есть процедура. Я в ней два раза пытаюсь использовать одну и ту же переменную в качестве динамического курсора:

/*ВЫТАСКИВАЕМ ИНФО ПО КОНТЕЙНЕРАМ ЕЩЁ НЕ РАСКРЫТЫМ В ТАБЛИЦЕ*/
--первый раз
declare @base_cur cursor
declare @id [int]

exec sp_executesql N'set @base_cur = cursor local for select id,[ИМЯ БАЗЫ ДАННЫХ],[ВЕРСИЯ ЭОД] from t_EOD_BDK_UPLOAD_containers_described1 where [ПРИСУТСТВУЕТ В ДАННЫЙ МОМЕНТ] = 1 open @base_cur', 
N'@base_cur cursor output', @base_cur = @base_cur output
FETCH NEXT FROM @base_cur into @id,@DBNAME,@SQL
WHILE @@FETCH_STATUS = 0
BEGIN
set @SQL = 'UPDATE...'
exec(@SQL)
FETCH NEXT FROM @base_cur into @id,@DBNAME,@SQL
END
Close @base_cur
.....


--второй раз
set @SQL = 
'set @base_cur = '
+ ' SELECT case when ... then ''UPDATE..'' end FROM  t1 join  t2 ... WHERE ... open @base_cur'

exec sp_executesql @SQL,N'@base_cur output', @base_cur = @base_cur output
FETCH NEXT FROM @base_cur into @SQL
WHILE @@FETCH_STATUS = 0
BEGIN
exec(@SQL)
--select @SQL
FETCH NEXT FROM @base_cur into @SQL
END
Close @base_cur
Deallocate @base_cur


На второе раз использования вот что пишет:

Сообщение 16951, уровень 16, состояние 1, процедура EOD_BDK_UPLOAD_containers_described1, строка 186
Переменную "@base_cur" нельзя использовать в качестве параметра, поскольку параметру CURSOR OUTPUT нельзя выделить курсор перед выполнением процедуры.
Сообщение 16917, уровень 16, состояние 2, процедура EOD_BDK_UPLOAD_containers_described1, строка 187
Курсор не открыт.
Сообщение 16917, уровень 16, состояние 1, процедура EOD_BDK_UPLOAD_containers_described1, строка 194
Курсор не открыт.
4 сен 13, 07:08    [14792192]     Ответить | Цитировать Сообщить модератору
 Re: Использование динамического курсора.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Мордор Держимордов
exec sp_executesql @SQL,N'@base_cur output', @base_cur = @base_cur output
А где тип переменной?
4 сен 13, 09:18    [14792473]     Ответить | Цитировать Сообщить модератору
 Re: Использование динамического курсора.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Мордор Держимордов
два раза пытаюсь использовать одну и ту же переменную в качестве динамического курсора

А почему бы не использовать две разные переменные?
4 сен 13, 09:21    [14792483]     Ответить | Цитировать Сообщить модератору
 Re: Использование динамического курсора.  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Deallocate не видно после первого использования. И коли скипаете тексты, хоть смотрите что получается, во втором случае у вас бред написан.
4 сен 13, 09:47    [14792589]     Ответить | Цитировать Сообщить модератору
 Re: Использование динамического курсора.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ambarka_max
Deallocate не видно после первого использования. И коли скипаете тексты, хоть смотрите что получается, во втором случае у вас бред написан.

Вот я набросал воспроизводимый скрипт:
--первый раз
declare @base_cur cursor;
declare @id int, @name sysname, @SQL nvarchar(1000);

exec sp_executesql N'set @base_cur = cursor local for select id, name from sysobjects open @base_cur', 
N'@base_cur cursor output', @base_cur = @base_cur output

set @base_cur = cursor local for select id, name from sysobjects

open @base_cur

FETCH NEXT FROM @base_cur into @id, @name

WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH NEXT FROM @base_cur into @id, @name
END
Close @base_cur

--второй раз
SET @SQL = 'set @base_cur = cursor local for SELECT case when id%2 = 1 then ''UPDATE'' ELSE ''SELECT'' end FROM sysobjects'

exec sp_executesql @SQL,N'@base_cur cursor output', @base_cur = @base_cur output

FETCH NEXT FROM @base_cur into @SQL
WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH NEXT FROM @base_cur into @SQL
END
Close @base_cur
Deallocate @base_cur

Msg 16951, Level 16, State 1, Line 23
The variable '@base_cur' cannot be used as a parameter because a CURSOR OUTPUT parameter must not have a cursor allocated to it before execution of the procedure.

Ок, раз "parameter must not have a cursor allocated to it", добавим deallocate после первого close. Возникает другая ошибка:
Msg 16950, Level 16, State 2, Line 23
The variable '@base_cur' does not currently have a cursor allocated to it.

В общем, какой-то замкнутый круг, и одну переменную не получается использовать.
4 сен 13, 09:58    [14792646]     Ответить | Цитировать Сообщить модератору
 Re: Использование динамического курсора.  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
В первом случае у вас N'set @base_cur = cursor local for select id, name from sysobjects open @base_cur'
А во втором?
4 сен 13, 10:11    [14792696]     Ответить | Цитировать Сообщить модератору
 Re: Использование динамического курсора.  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Соберитесь! На ровном месте спотыкаетесь)
4 сен 13, 10:13    [14792701]     Ответить | Цитировать Сообщить модератору
 Re: Использование динамического курсора.  [new]
Glory
Member

Откуда:
Сообщений: 104760
все замечательно работает. Если не писать лишних команд деклараций курсора, открытия. закрытия и тд
declare @base_cur cursor, @base_cur1 cursor;
declare @id int, @name sysname, @SQL nvarchar(1000);

exec sp_executesql N'set @base_cur = cursor local for select top 10 id, name from sysobjects open @base_cur', 
N'@base_cur cursor output', @base_cur = @base_cur output

--open @base_cur

FETCH NEXT FROM @base_cur --into @id, @name

WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH NEXT FROM @base_cur-- into @id, @name
END
Close @base_cur
Deallocate @base_cur

--второй раз
SET @SQL = 'set @base_cur = cursor local for SELECT top 10 name FROM sysobjects open @base_cur'

exec sp_executesql @SQL,N'@base_cur cursor output', @base_cur = @base_cur output

FETCH NEXT FROM @base_cur-- into @SQL
WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH NEXT FROM @base_cur-- into @SQL
END
Close @base_cur
Deallocate @base_cur
4 сен 13, 10:18    [14792721]     Ответить | Цитировать Сообщить модератору
 Re: Использование динамического курсора.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гость333
Вот я набросал воспроизводимый скрипт:
...


Посмотрел ещё раз... бред какой-то, а не воспроизводимый скрипт ;-)
4 сен 13, 10:40    [14792811]     Ответить | Цитировать Сообщить модератору
 Re: Использование динамического курсора.  [new]
eny
Member

Откуда: москва
Сообщений: 292
Гость333,

Чтобы несколько раз юзать переменную курсор нужно всегда объявлят ее локальным курсором, вот, а то в самом первом объявлении она явно не локальна и close\deallocate
4 сен 13, 11:41    [14793179]     Ответить | Цитировать Сообщить модератору
 Re: Использование динамического курсора.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
eny
Гость333,

Чтобы несколько раз юзать переменную курсор нужно всегда объявлят ее локальным курсором

Возьмите пример Glory, замените там local на global — всё прекрасно работает.
4 сен 13, 11:59    [14793328]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить