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

Откуда:
Сообщений: 162
Делю цикл по курсору, он не выполняется. При проверке вижу что @@FETCH_STATUS = 0 но BREAK выполняется. Почему?
 WHILE 1 = 1
  BEGIN
    FETCH NEXT FROM BigUpdate INTO @id, @customer_id, @area_code, @date, @time, @duargation;       
    IF (@@FETCH_STATUS <> 0) BREAK;
        
    INSERT INTO dbo.TrackingLines (traking_id, customer_id, area_id, call, year, month, duargation)
    VALUES (@traking_id, @customer_id, @area_code, CONVERT(datetime, @date + 'T' + @time), YEAR(CONVERT(datetime, @date)), Month(CONVERT(datetime, @date)), @duargation)
        
    DELETE FROM dbo.TrackingTemp
      WHERE id = @id;

  END;
28 июн 16, 16:31    [19346416]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
iap
Member

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

курсор-то, небось, динамический?
Как проверяете @@FETCH_STATUS ?

Почему не написать

OPEN
FETCH NEXT
WHILE @@FETCH_STATUS=0
BEGIN
INSERT
DELETE
FETCH NEXT
END
CLOSE
DEALLOCATE

?
28 июн 16, 16:40    [19346463]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
ErikI
@@FETCH_STATUS = 0 но BREAK выполняется. Почему?

вставте в тело print 1 (вместо инсерт/делит)

и посмотрите
28 июн 16, 16:41    [19346471]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
ErikI
Member

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

Курсор такой
  DECLARE BigUpdate CURSOR LOCAL FORWARD_ONLY STATIC FOR
    SELECT  traking_id, customer_id, area_code, date, time, duargation
      FROM  TrackingTemp
      WHERE traking_id = @traking_id;

Но какое он имеет отношение к вопросу? Я разумеется проверил что находится в @@FETCH_STATUS там 0, но Break выполняется! Вот я и не понимаю почему.
28 июн 16, 16:51    [19346551]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
StarikNavy
ErikI
@@FETCH_STATUS = 0 но BREAK выполняется. Почему?

вставте в тело print 1 (вместо инсерт/делит)

и посмотрите
Дело в том, что если, например, DELETE удаляет запись из той же таблицы, по которой сделан динамический курсор,
то всё дело может быть в том, что результат удаления сразу же отражается на текущей позиции курсора.

Этот эффект простым PRINTом не смоделировать!
28 июн 16, 16:52    [19346559]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Курсор-то статический. Так что мои рассуждения прошу тут же забыть.
28 июн 16, 16:54    [19346572]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Однако, не может ли FETCH перемещать курсор на только что удалённую запись?
@@FETCH_STATUS при этом, правда, должен равняться -1, ЕМНИП
28 июн 16, 16:55    [19346588]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
msLex
Member

Откуда:
Сообщений: 9271
iap
Однако, не может ли FETCH перемещать курсор на только что удалённую запись?
@@FETCH_STATUS при этом, правда, должен равняться -1, ЕМНИП

Статический курсор никак не завязан на изменения в исходных таблицах после его открытия.


if object_id('tempdb..#t') is not null
	drop table #t
create table #t (id int)


insert #t (id)
select 1 
union all
select 2


declare c cursor static local for 
select id
from #t
open c 

delete #t

while 1=1
begin
	declare @id int
	fetch next from c into @id
	if @@FETCH_STATUS != 0 
		break

	print @id
end
28 июн 16, 17:01    [19346636]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
msLex
Member

Откуда:
Сообщений: 9271
ErikI
При проверке вижу что @@FETCH_STATUS = 0 но BREAK выполняется.

видите где?
28 июн 16, 17:03    [19346646]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
msLex
ErikI
При проверке вижу что @@FETCH_STATUS = 0 но BREAK выполняется.

видите где?


Именно. А что справка пишет, которую обычно не читают?

Замечания
--------------------------------------------------------------------------------

Поскольку функция @@FETCH_STATUS является глобальной для всех курсоров в соединении, используйте ее с осторожностью.
28 июн 16, 18:01    [19347003]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
ErikI
Member

Откуда:
Сообщений: 162
Вот полный код курсора. Кто видит ошибку?
CREATE PROCEDURE dbo.TrackingCopyToWork
   @traking_id VARCHAR(12)
AS 
  SET NOCOUNT ON
  DECLARE
    @id INT,
    @customer_id VARCHAR(12),
    @area_code VARCHAR(10),
    @date VARCHAR(10),
    @time VARCHAR(8),
    @duargation VARCHAR(10)

   DECLARE BigUpdate CURSOR LOCAL FORWARD_ONLY STATIC FOR
    SELECT  traking_id, customer_id, area_code, date, time, duargation
      FROM  TrackingTemp
      WHERE traking_id = @traking_id;
  
  SET DATEFORMAT YMD;

  OPEN BigUpdate; 
  
  
  WHILE 1 = 1
  BEGIN
    print 1
    FETCH NEXT FROM BigUpdate INTO @id, @customer_id, @area_code, @date, @time, @duargation;       
    IF @@FETCH_STATUS != 0 BREAK;
        
    INSERT INTO dbo.TrackingLines (traking_id, customer_id, area_id, call, year, month, duargation)
    VALUES (@traking_id, @customer_id, @area_code, CONVERT(datetime, @date + 'T' + @time), YEAR(CONVERT(datetime, @date)), Month(CONVERT(datetime, @date)), @duargation)
        
    DELETE FROM dbo.TrackingTemp
      WHERE id = @id;

  END;
  
  CLOSE BigUpdate ;
  --DEALLOCATE BigUpdate ;

GO
28 июн 16, 21:20    [19347590]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
i-i
Guest
уважаемый, постом выше написали что @@FETCH_STATUS является глобалной для сессии. надо смотреть как вызывается процедура, скорее всего она колается из уже открытого курсора.

у меня другой вопрос - зачем тут курсор? можно и без него справиться. в крайнем случае перейдите на while
28 июн 16, 21:51    [19347628]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
ErikI
Member

Откуда:
Сообщений: 162
Можно. INSERT INTO SELECT работает. Но нужно так. Процедура вызывается из dbForge Studio ничего дополнительного нет.
28 июн 16, 22:04    [19347644]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
ErikI
Я разумеется проверил что находится в @@FETCH_STATUS там 0, но Break выполняется! Вот я и не понимаю почему.
Чудес не бывает. Запустите под отладчиком и смотрите, что там происходит на самом деле.
28 июн 16, 22:13    [19347670]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
ErikI
Member

Откуда:
Сообщений: 162
Единственное, что могу добавить получаю в отладке 2 сообщения cusor not open
28 июн 16, 22:18    [19347681]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
ErikI
Member

Откуда:
Сообщений: 162
Нашел проблему надо было в начала поставить SET DATEFORMAT YMD был exception
28 июн 16, 22:25    [19347711]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ErikI
Нашел проблему надо было в начала поставить SET DATEFORMAT YMD был exception
А зачем вообще SET DATEFORMAT?
Он вообще никогда нигде не нужен
29 июн 16, 09:32    [19348467]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
И не пойму, что вам даёт PRINT 1 ??

После FETCH поставить PRINT @@FETCH_STATUS слабО?

И правильно сказали, чтьо курсор тут нафиг не нужен.
29 июн 16, 09:35    [19348478]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
iap
ErikI
Нашел проблему надо было в начала поставить SET DATEFORMAT YMD был exception
А зачем вообще SET DATEFORMAT?
Он вообще никогда нигде не нужен


Иногда так можно исправить получение клиентских данных.
29 июн 16, 12:12    [19349307]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4539
iap
ErikI
Нашел проблему надо было в начала поставить SET DATEFORMAT YMD был exception
А зачем вообще SET DATEFORMAT?
Он вообще никогда нигде не нужен

Судя по коду... там даты и время строками хранятся...
29 июн 16, 12:40    [19349436]     Ответить | Цитировать Сообщить модератору
 Re: Не работает сравнение  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
buser
iap
пропущено...
А зачем вообще SET DATEFORMAT?
Он вообще никогда нигде не нужен

Судя по коду... там даты и время строками хранятся...
Судя вот по этому
@date + 'T' + @time
там хранится строка YYYY-MM-DD.
Год и месяц достаются из этой строки без проблем без всяких YEAR() и MONTH().
Отсюда получается, что DATEFORMAT не нужен.
29 июн 16, 12:47    [19349473]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить