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

Откуда: Дубна
Сообщений: 295
	SELECT     dbo.s_nd_publ.id_publ
		,dbo.s_nd_publ_grif.grif
		,dbo.s_nd_publ_type_izd.name_type_izd
		,dbo.s_nd_publ.id_otecestv
		,dbo.s_nd_publ.id_vak
		,dbo.s_nd_publ.id_grif
	FROM dbo.s_nd_publ INNER JOIN
		dbo.s_nd_publ_type_izd ON dbo.s_nd_publ.id_type_izd = dbo.s_nd_publ_type_izd.id_type_izd INNER JOIN
		dbo.s_nd_publ_grif ON dbo.s_nd_publ.id_grif = dbo.s_nd_publ_grif.id_grif


	declare @id_publ int
	declare @url varchar(255)
	declare @type_izd varchar(50)
	declare @id_otecestv int
	declare @grif varchar(50)
	declare @id_grif int
	declare @id_vak int
	declare @cur cursor
	
	set @cur = cursor scroll
	for 
	SELECT     dbo.s_nd_publ.id_publ
		,dbo.s_nd_publ_grif.grif
		,dbo.s_nd_publ_type_izd.name_type_izd
		,dbo.s_nd_publ.id_otecestv
		,dbo.s_nd_publ.id_vak
		,dbo.s_nd_publ.id_grif
	FROM dbo.s_nd_publ INNER JOIN
		dbo.s_nd_publ_type_izd ON dbo.s_nd_publ.id_type_izd = dbo.s_nd_publ_type_izd.id_type_izd INNER JOIN
		dbo.s_nd_publ_grif ON dbo.s_nd_publ.id_grif = dbo.s_nd_publ_grif.id_grif
	where id_publ in (select id_publ from nd_aut)
	open @cur
	fetch next from @cur into @id_publ, @grif, @type_izd, @id_otecestv, @id_vak, @id_grif
	while (@@fetch_status = 0)
	Begin
		if (@id_otecestv = 2)
			if(@id_vak = 1)
				select @id_publ
			else
				select @id_publ
		else
			if(@id_vak = 1)
				select @id_publ
			else
				select @id_publ
				
	fetch next from @cur into @id_publ, @grif, @type_izd, @id_otecestv, @id_vak, @id_grif
	End
	close @cur


Вот эти два селекта. Первый (по нему же бежит курсор собственно возвращает полный набор данных).

Но когда курсор начинает бежать и выполнять действия, то перескакивает некоторые значения. Одни и те же, но как он их выбрал - неясно.
К примеру:
верхний селект возвращает след:
id
2 Нет Статья 1 2 1
3 Нет Тезисы 1 2 1
4 Нет Статья 1 2 1
5 Нет Статья 1 2 1
6 Нет Тезисы 1 2 1
7 Нет Статья 1 2 1
8 Нет Статья 1 2 1
9 Нет Тезисы 2 2 1
10 Нет Статья 2 2 1
11 Нет Тезисы 2 2 1
12 Нет Тезисы 2 2 1
13 Нет Тезисы 1 2 1
14 Нет Тезисы 2 2 1
15 Нет Тезисы 1 2 1
16 Нет Тезисы 1 2 1
17 Нет Тезисы 2 2 1
18 Нет Статья 2 2 1

Ну курсор при работе упорно перескакивает 16ю запись! А дальше - хуже. В некоторых местах целые куски проскакивает.
Примечание: Внутри курсора вместо селектов стоит update временной таблицы.

Куда копать?! Почему курсор так себя ведёт?
29 мар 12, 17:15    [12335249]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Убедительная просьба не кричать про ненадобность и убогость курсоров и т.п. Всё знаем, но надо решить вот так. Времени делать по уму нет на данный момент.
29 мар 12, 17:16    [12335268]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Где ORDER BY?

Курсор динамический - моментально видит все изменения в таблицах
(правда, здесь только SELECTы, но теоретически с таблицами в этот момент кто-то что-то может делать -
вот записи и перемещаются в результирующем наборе строк)
29 мар 12, 17:24    [12335351]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А scroll с каким-то умыслом указан в опциях курсора?

Ну и потом, о каком порядке вы говорите, если он у вас в запросе не задан никак?
29 мар 12, 17:26    [12335374]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
З.Ы. И да. Курсоры убогие и, зачастую, не нужны.
29 мар 12, 17:27    [12335385]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SCROLL - это, конечно, очень удобно, особенно для отладки.
Но это самый тяжёлый, самый тормозной вид курсора.
29 мар 12, 17:27    [12335394]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Удаление scroll и добавление order by id_publ не решает проблему.
Таблицу никто не использует. Я вообще один на сервере.
29 мар 12, 17:28    [12335405]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Алексей Ку.
Удаление scroll и добавление order by id_publ не решает проблему.
Таблицу никто не использует. Я вообще один на сервере.
Давайте репро с fast_forward и order by. До этого - "не верю" (с).
29 мар 12, 17:29    [12335412]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Алексей Ку.
Удаление scroll и добавление order by id_publ не решает проблему.
Таблицу никто не использует. Я вообще один на сервере.
Значения id_publ уникальны в результате SELECTа?
29 мар 12, 17:30    [12335417]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Эгегей. А ничего, что в курсоре еще есть where id_publ in (select id_publ from nd_aut), а верхнем запросе его как бы нет?
29 мар 12, 17:30    [12335421]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Гавриленко Сергей Алексеевич
Алексей Ку.
Удаление scroll и добавление order by id_publ не решает проблему.
Таблицу никто не использует. Я вообще один на сервере.
Давайте репро с fast_forward и order by. До этого - "не верю" (с).
+ STATIC
29 мар 12, 17:31    [12335423]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
set @cur = cursor fast_forward--scroll
	for 
	SELECT     dbo.s_nd_publ.id_publ
		,dbo.s_nd_publ_grif.grif
		,dbo.s_nd_publ_type_izd.name_type_izd
		,dbo.s_nd_publ.id_otecestv
		,dbo.s_nd_publ.id_vak
		,dbo.s_nd_publ.id_grif
	FROM dbo.s_nd_publ INNER JOIN
		dbo.s_nd_publ_type_izd ON dbo.s_nd_publ.id_type_izd = dbo.s_nd_publ_type_izd.id_type_izd INNER JOIN
		dbo.s_nd_publ_grif ON dbo.s_nd_publ.id_grif = dbo.s_nd_publ_grif.id_grif
	
	where id_publ in (select id_publ from nd_aut) -- вот ваша пропускалка, ага
	order by id_publ
	open @cur
	fetch next from @cur into @id_publ, @grif, @type_izd, @id_otecestv, @id_vak, @id_grif
	while (@@fetch_status = 0)
	Begin
		if (@id_otecestv = 2)
			if(@id_vak = 1)
				update @publications 
				set publ_izd_info2 = isnull(@type_izd + ' в зарубежном издании; ', '') + isnull('Гриф '+ @grif,'')-- + '; Рекомендовано ВАК'
				where id_publ=@id_publ
			else
				update @publications 
				set publ_izd_info2 = isnull(@type_izd + ' в зарубежном издании; ', '') + isnull('Гриф '+ @grif,'')
				where id_publ=@id_publ
		else
			if(@id_vak = 1)
				update @publications 
				set publ_izd_info2 = isnull(@type_izd, '') + isnull('; Гриф '+ @grif,'')-- + '; Рекомендовано ВАК'
				where id_publ=@id_publ
			else
				update @publications 
				set publ_izd_info2 = isnull(@type_izd, '') + isnull('; Гриф '+ @grif,'')
				where id_publ=@id_publ
				
	fetch next from @cur into @id_publ, @grif, @type_izd, @id_otecestv, @id_vak, @id_grif
	End
	close @cur


По прежнему пропускает!

Сообщение было отредактировано: 29 мар 12, 17:32
29 мар 12, 17:31    [12335427]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Алексей Ку.
Убедительная просьба не кричать про ненадобность и убогость курсоров и т.п. Всё знаем, но надо решить вот так. Времени делать по уму нет на данный момент.
Ща всемирный ALL комуто нахаляву кастыль в говнокодец засунет за красивые глаза.

Даже сам курсор нормально не могут написать - лень. При этом море желания писать посты на форуме. Как же этот синдром называется ...

2НетСтатья121
3НетТезисы121
...

Специально для лентяев: в CSV тег дописывается "= " ("=\t")
29 мар 12, 17:32    [12335435]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Да это не csv! Просто ctrc+c/v из студии после селекта.

Static тоже не помогает.
ПРо логику внутри курсора молчу конечно. Но времени делать нету "по уму".
29 мар 12, 17:34    [12335444]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Алексей Ку.
Да это не csv! Просто ctrc+c/v из студии после селекта.

Static тоже не помогает.
ПРо логику внутри курсора молчу конечно. Но времени делать нету "по уму".
Я вместо ответа случайно поправил ваш пост. Прочтите его выше.
29 мар 12, 17:35    [12335454]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Да она была там. Всем спасибо!
29 мар 12, 17:35    [12335461]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Гавриленко Сергей Алексеевич,

Видел. Спасибо большое ещё раз!
Будем расти дальше...
29 мар 12, 17:35    [12335463]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Mnior
Как же этот синдром называется ...

Это называется "удаленная отладка с помощью форума".
29 мар 12, 17:36    [12335465]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Гавриленко Сергей Алексеевич,

Ну типа того, да... Когда зад горит, а сидишь за этим всем уже далеко не первый час, то приходится прибегать к подобным вариантам! Пора, пожалуй, домой отдыхать...

Ведь ошибка вообще идеалогическая была. Там совсем другая таблица должна была быть. КОроче в топку - я пошёл отдыхать...
29 мар 12, 17:39    [12335485]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
	UPDATE	X
	SET	publ_izd_info2 = CASE	WHEN N.id_otecestv = 2 AND N.id_vak = 1	THEN IsNull(T.name_type_izd + ' в зарубежном издании; ', '')	+ IsNull(  'Гриф ' + G.grif,'')	-- + '; Рекомендовано ВАК'
					WHEN N.id_otecestv = 2			THEN IsNull(T.name_type_izd + ' в зарубежном издании; ', '')	+ IsNull(  'Гриф ' + G.grif,'')
					WHEN                       N.id_vak = 1	THEN IsNull(T.name_type_izd, '')				+ IsNull('; Гриф ' + G.grif,'')	-- + '; Рекомендовано ВАК'
										ELSE IsNull(T.name_type_izd, '')				+ IsNull('; Гриф ' + G.grif,'')
					END
	FROM	     @publications		X
		JOIN dbo.s_nd_publ		N ON N.id_publ		= X.id_publ
		JOIN dbo.s_nd_publ_type_izd	T ON T.id_type_izd	= N.id_type_izd
		JOIN dbo.s_nd_publ_grif		G ON G.id_grif		= N.id_grif
	WHERE	Exists(SELECT * FROM dbo.nd_aut A WHERE A.id_publ = N.id_publ)
29 мар 12, 17:44    [12335507]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Гавриленко Сергей Алексеевич
Это называется "удаленная отладка с помощью форума".
Скорее всеобщий пофигизм.
Никакой культуры совершенно.
29 мар 12, 17:47    [12335535]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Mnior
	UPDATE	X
	SET	publ_izd_info2 = CASE	WHEN N.id_otecestv = 2 AND N.id_vak = 1	THEN IsNull(T.name_type_izd + ' в зарубежном издании; ', '')	+ IsNull(  'Гриф ' + G.grif,'')	-- + '; Рекомендовано ВАК'
					WHEN N.id_otecestv = 2			THEN IsNull(T.name_type_izd + ' в зарубежном издании; ', '')	+ IsNull(  'Гриф ' + G.grif,'')
					WHEN                       N.id_vak = 1	THEN IsNull(T.name_type_izd, '')				+ IsNull('; Гриф ' + G.grif,'')	-- + '; Рекомендовано ВАК'
										ELSE IsNull(T.name_type_izd, '')				+ IsNull('; Гриф ' + G.grif,'')
					END
	FROM	     @publications		X
		JOIN dbo.s_nd_publ		N ON N.id_publ		= X.id_publ
		JOIN dbo.s_nd_publ_type_izd	T ON T.id_type_izd	= N.id_type_izd
		JOIN dbo.s_nd_publ_grif		G ON G.id_grif		= N.id_grif
	WHERE	Exists(SELECT * FROM dbo.nd_aut A WHERE A.id_publ = N.id_publ)


Ну конечно круто что можете писать такие вещи. Я мозгами ещё не дорос до такого уровня. ПОтому и приходится просить вот так помощи!
29 мар 12, 17:50    [12335555]     Ответить | Цитировать Сообщить модератору
 Re: Курсор прыгает, пропускает  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Алексей Ку.
Ну конечно круто что можете писать такие вещи. Я мозгами ещё не дорос до такого уровня.
Возможно вы просто не ставите перед собой такой цели.
Научится делать хорошо и правильно всегда стоит приоритетом выше, чем что либо сделать.
А если этого не делать (откладывание, прокрастинация?) то так и останетесь в состоянии, как пробка в бутылке. Вечно спешащим и просящим помощи.
Поменяйте приоритеты, и может быть стрельнёт.

На счёт "дорос", какой курс? Хотя бы на втором надо было такое уметь и видеть. А вообще абстрактное и гибкое мышление это в школе закаляют.
Декларативное программирование, в общем.

Хотя может я и перегибаю.
30 мар 12, 00:16    [12337227]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить