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

Откуда:
Сообщений: 7
Подскажите, пожалуйста, кто понимает. Написал примитивный курсор, который не хочет работать.
Код такой:
declare @fullname varchar(500) = '', @string varchar(50)
declare @tabl table (objname varchar(50))
insert @tabl (objname) values ('one')
insert @tabl (objname) values ('two')
insert @tabl (objname) values ('three')
declare objcursor cursor for select objname from @tabl
open objcursor
fetch next from objcursor into @string
while @@FETCH_STATUS = 0
begin
 set @fullname = @string + ' ' + @fullname
 fetch next from objcursor into @string 
end

при этом при первом же проходе @@FETCH_STATUS уходит в -1, цикл заканчивается.
Попытался заменить @@FETCH_STATUS на вызов
select fetch_status from sys.dm_exec_cursors(0) where name='objcursor'

но это привело к зависанию (бесконечный цикл).
Пошаговое выполнение показало, что fetch внутри цикла не выполняется.
В чём может быть засада?

ms sql server 2008 r2

спасибо.
15 ноя 13, 17:23    [15138226]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
sMeshnoj
при этом при первом же проходе @@FETCH_STATUS уходит в -1, цикл заканчивается.
Нету там ошибки, цикл отрабатывает 3 раза
15 ноя 13, 17:50    [15138518]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
iap
Member

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

А где CLOSE и DEALLOCATE?
15 ноя 13, 18:19    [15138661]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37056
Это не курсор не выполняется, это кто-то null'ы складывать не умеет просто.
З.Ы.
declare @fullname varchar(500) = '', @string varchar(50) = '' 
15 ноя 13, 18:50    [15138817]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Гавриленко Сергей Алексеевич
Это не курсор не выполняется, это кто-то null'ы складывать не умеет просто.
З.Ы.
declare @fullname varchar(500) = '', @string varchar(50) = '' 
Он же вроде @string инициализирует из курсора, а в табличной переменной NULLа нет?
15 ноя 13, 18:57    [15138847]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
Гость333
Member

Откуда:
Сообщений: 3683
sMeshnoj
Пошаговое выполнение показало, что fetch внутри цикла не выполняется.

А профайлер что показывает?
15 ноя 13, 18:59    [15138858]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Скопипастил к себе, запустил - всё как надо работает.
15 ноя 13, 19:05    [15138884]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Гость333
sMeshnoj
Пошаговое выполнение показало, что fetch внутри цикла не выполняется.

А профайлер что показывает?
Достаточно в цикле написать SELECT @fullname
15 ноя 13, 19:08    [15138897]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
o-o
Guest
покажите нам картинку в доказательство, с принтом.
вот такую:

К сообщению приложен файл. Размер - 20Kb
15 ноя 13, 19:11    [15138909]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
sMeshnoj
Member

Откуда:
Сообщений: 7
iap,
ну, не написал. Лень было, переписывал с другого компа, с окошка, без копипаста.
16 ноя 13, 08:47    [15140790]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
sMeshnoj
Member

Откуда:
Сообщений: 7
alexeyvg,
А у меня - есть. И цикл для @@FETCH_STATUS вообще не отрабатывает, а для выборки зацикливается. См. сообщение.
В этом и вопрос, ващета.
16 ноя 13, 08:48    [15140791]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
sMeshnoj
Member

Откуда:
Сообщений: 7
Гавриленко Сергей Алексеевич,
вот это, между прочим, без разницы. С null'ами там порядочек, как показывает дебаг. Бесконечная строка в бесконечном цикле нарастает от души.
16 ноя 13, 09:01    [15140796]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
sMeshnoj
А у меня - есть
Ну если ошибка воспроизводится только у вас, то чем можно помочь?
sMeshnoj
переписывал с другого компа, с окошка, без копипаста.
Может чего не так переписали?

А вообще, начните с показа результата
select @@version
16 ноя 13, 11:10    [15140941]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
sMeshnoj
alexeyvg,
А у меня - есть. И цикл для @@FETCH_STATUS вообще не отрабатывает, а для выборки зацикливается. См. сообщение.
В этом и вопрос, ващета.
Просто поверьте - этот код не может работать неправильно.

"цикл для @@FETCH_STATUS" - это что такое? У @@FETCH_STATUS нету никаких циклов, это функция, синтаксически проедставленная в виде глобальной переменной.

Просто аккуратно скопируйте выложенный вами-же в первом посте код в окошко QUERY, добавьте в конец select @fullname, и увидите, что всё работает.

ЗЫ. Код можно выполнить только один раз.
16 ноя 13, 11:46    [15140995]     Ответить | Цитировать Сообщить модератору
 Re: дурит fetch в курсоре!  [new]
Сид
Member

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

А чем это хуже?

select @fullname=objname+isnull(' '+@fullname,'')
from @tabl


Можно ещё через
for xml path('')
сделать - на больших выборках часто быстрее отрабатывает.
17 ноя 13, 15:30    [15143735]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить