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

Откуда:
Сообщений: 11
Подскажите пожалуйста, в чем дело? В результирующей табл. не выводятся первые значения всех переменных, кроме @c. Далее все норм. ( Рис.1)
Картинка с другого сайта.

Собственно говоря сам курсор (костяк взят с этого форума) :

DECLARE @tbl TABLE (КарточкаID INT, СвязиID VARCHAR(8000), Дата_Рег Varchar(8000))
SET NOCOUNT ON
DECLARE @c INT, @p VARCHAR(8000), @reg Varchar (8000), @cNext INT, @pNext VARCHAR(max), @idNext VARCHAR(40), @regNext Varchar (40)
DECLARE c CURSOR FOR
SELECT f_parentID, t_carddoc.f_id, t_carddoc.f_Topic, t_carddoc.f_dtRegisterDT
FROM t_relation left join t_carddoc on t_carddoc.f_id = f_dependentID
where (t_Relation.f_Type = 3)
ORDER BY f_parentID, t_carddoc.f_id ;
OPEN c ;
FETCH NEXT FROM c INTO @cNext, @idNext, @pNext, @regNext ;
SET @c = @cNext ;
WHILE @@FETCH_STATUS = 0 BEGIN
IF @cNext != @c BEGIN
INSERT @tbl SELECT @c, ISNULL(@p, ''), isnull (@reg, '') ;
SELECT @p = 'Id: ' + @idNext + ' ' + ', Тема: ' + @PNext ;
Select @reg = 'Id: ' + @idNext + ' ' + ', Дата рег: ' + @regNext, @c =@cNext ;
end else
begin
SET @p = @p + ', Id: ' + @idNext + ' ' + ', Тема: ' + @pNext ;
SET @reg = @reg + ', Id: ' + @idNext + ' ' + ', Дата рег: ' + @regNext ;
END

FETCH NEXT FROM c INTO @cNext, @idNext, @pNext, @regNext
END
INSERT @tbl SELECT @c, ISNULL(@p, ''), ISNULL (@reg, '') ;
CLOSE c ;
DEALLOCATE c ;
SELECT * FROM @tbl ;
7 сен 12, 11:07    [13128368]     Ответить | Цитировать Сообщить модератору
 Re: Курсор выводит не все данные.  [new]
tanglir
Member

Откуда:
Сообщений: 28966
Alexden
SET NOCOUNT ON
В ГФ!
Когда они кончатся уже?..
7 сен 12, 11:41    [13128656]     Ответить | Цитировать Сообщить модератору
 Re: Курсор выводит не все данные.  [new]
Alexden
Member

Откуда:
Сообщений: 11
tanglir
Alexden
SET NOCOUNT ON
В ГФ!
Когда они кончатся уже?..


Извиняюсь, поспешил. По возможности, прошу перенести в нужный раздел.

Почитал про "SET NOCOUNT ON", яснее не стало. Все равно спасибо.
7 сен 12, 12:35    [13129053]     Ответить | Цитировать Сообщить модератору
 Re: Курсор выводит не все данные.  [new]
tanglir
Member

Откуда:
Сообщений: 28966
Alexden
Почитал про "SET NOCOUNT ON", яснее не стало
Это просто признак, что пост не в тот форум.
Хотя какая разница, всё равно ведь вот тут
INSERT @tbl SELECT @c, ISNULL(@p, ''), isnull (@reg, '') ;
явно должно быть не иснулл, а коалесце().
7 сен 12, 12:40    [13129092]     Ответить | Цитировать Сообщить модератору
 Re: Курсор выводит не все данные.  [new]
Alexden
Member

Откуда:
Сообщений: 11
Поправил след строки:

SET @p = COALESCE(@p + ', Id: ', SPACE (0))+ @idNext + ' ' + ', Тема: ' + @pNext ;
SET @reg = COALESCE(@reg + ', Id: ', SPACE (0)) + @idNext + ' ' + ', Дата рег: ' + @regNext ;
END

FETCH NEXT FROM c INTO @cNext, @idNext, @pNext, @regNext
END
INSERT @tbl SELECT @c, @p, @reg


Так же, как предположили вы:
SET @p = @p + ', Id: ' + @idNext + ' ' + ', Тема: ' + @pNext ;
SET @reg = @reg + ', Id: ' + @idNext + ' ' + ', Дата рег: ' + @regNext ;
END

FETCH NEXT FROM c INTO @cNext, @idNext, @pNext, @regNext
END
INSERT @tbl SELECT @c, COALESCE (@p, ''), COALESCE (@reg, '')


Теперь выдает нули: Картинка с другого сайта.
7 сен 12, 13:19    [13129434]     Ответить | Цитировать Сообщить модератору
 Re: Курсор выводит не все данные.  [new]
tanglir
Member

Откуда:
Сообщений: 28966
Alexden
INSERT @tbl SELECT @c, @p, @reg
Логично предположить, что в переменные @p,@reg попадают null-ы. А уж откуда они берутся - разбирайтесь сами - скорее всего, где-то что-то недоинициализировано, либо коалесце навешан не везде, где м.б. нулл.
Кстати, тут
IF @cNext != @c
вы вообще не учитываете, что одна/обе переменные могут быть нуллами.
ЗЫ. Без тега [ src ] разбираться в этой каше желания никакого нет (и на ГФ, уверяю вас, будет то же самое).
7 сен 12, 13:27    [13129513]     Ответить | Цитировать Сообщить модератору
 Re: Курсор выводит не все данные.  [new]
Alexden
Member

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

Спасибо за ответы. Косяков за сегодняшнее/ий утро/день было много. В дальнейшем буду осмотрительней.

Исходный код:

DECLARE @tbl TABLE (КарточкаID INT, СвязиID VARCHAR(8000), Дата_Рег Varchar(8000))


DECLARE @c INT, @p VARCHAR(8000), @reg Varchar (8000), @cNext INT, @pNext VARCHAR(max), @idNext VARCHAR(40), @regNext Varchar (40)
DECLARE c CURSOR FOR
        SELECT f_parentID, t_carddoc.f_id, t_carddoc.f_Topic, t_carddoc.f_dtRegisterDT
          FROM t_relation left join t_carddoc on t_carddoc.f_id = f_dependentID
          where (t_Relation.f_Type = 3)
         ORDER BY f_parentID, t_carddoc.f_id ;
        OPEN c ;
        FETCH NEXT FROM c INTO @cNext, @idNext, @pNext, @regNext ;
        SET @c = @cNext ;
        WHILE @@FETCH_STATUS = 0 BEGIN
             IF @cNext != @c BEGIN
                  INSERT @tbl SELECT @c, @p, @reg ;
                  SELECT @p = 'Id: ' + @idNext + ' ' + ', Тема: ' + @PNext  ;
                  Select @reg = 'Id: ' + @idNext + ' ' + ', Дата рег: ' + @regNext, @c =@cNext  ;
             end else 
             begin
                  SET @p = COALESCE(@p + ', Id: ', SPACE (0))+ @idNext + ' ' + ', Тема: ' + @pNext ;
                  SET @reg = COALESCE(@reg + ', Id: ', SPACE (0)) + @idNext + ' ' + ', Дата рег: ' + @regNext ;
                END 
                  
             FETCH NEXT FROM c INTO @cNext, @idNext, @pNext, @regNext
        END
        INSERT @tbl SELECT @c, COALESCE (@p, ''), COALESCE (@reg, '') ;
        CLOSE c ;
DEALLOCATE c ;
SELECT * FROM @tbl ;
7 сен 12, 13:47    [13129683]     Ответить | Цитировать Сообщить модератору
 Re: Курсор выводит не все данные.  [new]
tanglir
Member

Откуда:
Сообщений: 28966
Alexden, почему @pNext, @regNext не защищены от нуллов? Там поля нот нулл или вы просто об этом забыли?
И вообще, есть ощущение, что вместо этих плясок с бубномкурсором вам нужны оконные функции, но это пусть уже на месте рассказывают...

Модератор: Тема перенесена из форума "MySQL".


Сообщение было отредактировано: 7 сен 12, 22:43
7 сен 12, 13:55    [13129767]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить