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

Откуда:
Сообщений: 63
Всем доброго времени суток! =)

В хранимой процедуре создаю динамический курсор:

SET @SQL = 'DECLARE TagsName CURSOR LOCAL FORWARD_ONLY READ_ONLY
	FOR SELECT [ID] ,[Tag_Name] FROM [Luminary].[dbo].[DR_Tags] WHERE Tag_Name like ''%Параметр'' '
exec sp_executesql @SQL
OPEN TagsName
FETCH NEXT FROM TagsName INTO @Tag_Name
WHILE @@FETCH_STATUS = 0
BEGIN


При вызове процедуры получаю ошибку:
Сообщение 16916, уровень 16, состояние 1, процедура Report_Flow_Rate, строка 65
A cursor with the name 'TagsName' does not exist.

Собственно не понимаю в чем затык, О_о Может кто сталкивался с подобным и может подсказать решение?
25 июн 13, 09:04    [14477559]     Ответить | Цитировать Сообщить модератору
 Re: Динамический курсор - does not exist  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
VASABI,

Решение - возврат курсора в OUTPUT-параметре типа CURSOR из sp_executesql.

Но лучше отказаться от курсора.

Кстати, лучше курсор FAST_FORWARD.
Непонятно также, зачем вообще создавать ЭТОТ курсор именно в DSQL?
25 июн 13, 09:11    [14477590]     Ответить | Цитировать Сообщить модератору
 Re: Динамический курсор - does not exist  [new]
VASABI
Member

Откуда:
Сообщений: 63
iap,

Спасибо за оперативность. DSQL использую т.к. вместо слова "Параметр" будет использована в дальнейшем переменная.
25 июн 13, 09:16    [14477614]     Ответить | Цитировать Сообщить модератору
 Re: Динамический курсор - does not exist  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Ну локал же! Вы создаете ЛОКАЛЬНЫЙ курсор в отдельном батче.
25 июн 13, 09:35    [14477705]     Ответить | Цитировать Сообщить модератору
 Re: Динамический курсор - does not exist  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
DECLARE @SQL nVarchar(300) 
SET @SQL = 'DECLARE TagsName CURSOR   FORWARD_ONLY READ_ONLY
	FOR SELECT  1 as [BebEBe] '
exec sp_executesql @SQL
OPEN TagsName
 
DECLARE @int int 
FETCH NEXT FROM TagsName INTO @int 

select @int 

CLOSE TagsName
DEALLOCATE TagsName

 
 
25 июн 13, 09:36    [14477715]     Ответить | Цитировать Сообщить модератору
 Re: Динамический курсор - does not exist  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
VASABI
iap,

Спасибо за оперативность. DSQL использую т.к. вместо слова "Параметр" будет использована в дальнейшем переменная.
Very funny.
where Tag_Name like '%' + @VarMask
25 июн 13, 09:37    [14477719]     Ответить | Цитировать Сообщить модератору
 Re: Динамический курсор - does not exist  [new]
VASABI
Member

Откуда:
Сообщений: 63
Сделал так:
DECLARE @TagsName AS CURSOR;

SELECT @TSQL = 'SET @c=CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR SELECT [Tag_Name] FROM [Luminary].[dbo].[DR_Tags] WHERE Tag_Name like ''%Дебит''; OPEN @c';
        
EXECUTE sp_executesql
    @stmt = @TSQL,
    @params = N'@c AS CURSOR OUTPUT',
    @c = @TagsName OUTPUT;
FETCH NEXT FROM @TagsName INTO @Tag_Name
WHILE @@FETCH_STATUS = 0
BEGIN


Сообщения от Cammomile и Ennor Tiegael после =). Спасибо за помощь.
25 июн 13, 09:44    [14477758]     Ответить | Цитировать Сообщить модератору
 Re: Динамический курсор - does not exist  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А зачем делать ЛОКАЛЬНЫЙ курсор чтобы потом выдергивать его вне батча-то? Идею поясните, может ячего-то важного не знаю
25 июн 13, 09:49    [14477782]     Ответить | Цитировать Сообщить модератору
 Re: Динамический курсор - does not exist  [new]
VASABI
Member

Откуда:
Сообщений: 63
Cammomile,

Local использую для определения области имени курсора внутри хранимки. Честно говоря, я не очень понимаю чем это плохо и был бы рад, если Вы объясните.
25 июн 13, 09:59    [14477848]     Ответить | Цитировать Сообщить модератору
 Re: Динамический курсор - does not exist  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
VASABI
Cammomile,

Local использую для определения области имени курсора внутри хранимки. Честно говоря, я не очень понимаю чем это плохо и был бы рад, если Вы объясните.
Читаем: LOCAL, GLOBAL
25 июн 13, 10:06    [14477902]     Ответить | Цитировать Сообщить модератору
 Re: Динамический курсор - does not exist  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Ну конечно же читали. И читоо?

Мы же делаем локальный курсор именно чтоб ограничить область видимости, правда?
А смысл его протаскивать через параметр ускользает. Ну разве что deallocate не писать?
25 июн 13, 10:10    [14477938]     Ответить | Цитировать Сообщить модератору
 Re: Динамический курсор - does not exist  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Но с другой стороны тут понаписано кода чтобы его вернуть. В чём выгода-то?

ps
The LOCAL cursor will then be implicitly deallocated when the parameter or variable referencing the cursor in the code that called the procedure goes out scope.

Никогда не понимал что значит "parameter or variable goes out scope "
25 июн 13, 10:19    [14478000]     Ответить | Цитировать Сообщить модератору
 Re: Динамический курсор - does not exist  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Cammomile
Ну конечно же читали. И читоо?

Мы же делаем локальный курсор именно чтоб ограничить область видимости, правда?
А смысл его протаскивать через параметр ускользает. Ну разве что deallocate не писать?
Зацените:
USE tempdb;
GO
CREATE PROC P1 AS DECLARE CURS CURSOR GLOBAL FOR SELECT * FROM sys.objects;
GO
CREATE PROC P2 AS DECLARE CURS CURSOR GLOBAL FOR SELECT * FROM sys.objects;
GO

EXEC P1;
EXEC P2;

DEALLOCATE CURS;
DROP PROC P1,P2;
USE tempdb;
GO
CREATE PROC P1 AS DECLARE CURS CURSOR LOCAL FOR SELECT * FROM sys.objects;
GO
CREATE PROC P2 AS DECLARE CURS CURSOR LOCAL FOR SELECT * FROM sys.objects;
GO

EXEC P1;
EXEC P2;

DROP PROC P1,P2;
Таким образом, используя один и тот же вызов sp_executesql
для двух разных переменных типа CURSOR (а они определяются как LOCAL),
можно работать с двумя курсорами.
Были бы курсоры глобальные, второй с тем же именем в DSQL создать и вернуть в параметре не получилось бы
25 июн 13, 10:23    [14478024]     Ответить | Цитировать Сообщить модератору
 Re: Динамический курсор - does not exist  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Логично, но я имел в виду касаемо задачи автора.

И что, всё-таки, значит "параметр выходит из скоупа" ?
25 июн 13, 10:35    [14478094]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить