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

Откуда: Москва
Сообщений: 295
DECLARE crs CURSOR FOR
	SELECT Field1, Field2 FROM Table1 

OPEN crs

FETCH NEXT FROM crs 

WHILE @@FETCH_STATUS = 0
BEGIN
	SELECT crs.Field1
END

CLOSE crs
DEALLOCATE crs

Вопрос в следующем: хотел обращаться к текущей строке напрямую, т.к. полей много и не хочется плодить переменные. Поэтому не делаю
FETCH NEXT FROM crs INTO @Var1, @Var2
.

Не работает ('crs is not a table name or alias').

Каг? 8-(..)

IF (crs.Field1 > 0)
IF (SELECT Field1 FROM crs) > 0 
и прочим образом уже поизвращался, результат одинаков...

Можно ли как-то обратиться к текущей строке напрямую?
25 июн 09, 17:07    [7344386]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
Glory
Member

Откуда:
Сообщений: 104760
Что конкретно для вас есть "обращаться к текущей строке напрямую" ?
И почему вообще курсор использован ?
25 июн 09, 17:11    [7344418]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
GSerg
Member

Откуда: Магадан
Сообщений: 205
Eugene_p1
хотел обращаться к текущей строке напрямую, т.к. полей много и не хочется плодить переменные

Это как "файл большой, поэтому хочу читать его, не открывая его".

Если FETCH идёт не в переменную, значит он идёт прямо на клиента.
И потом ещё SELECT туда же досылается, типа для тупых.
И всё это в бесконечном цикле, т.к. внутри while нет fetch.

Не хотите плодить переменные -- в объявлении курсора укажите только поле, которое вам надо. И его фетчите. В переменную. Одну.
25 июн 09, 17:21    [7344523]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
Crimean
Member

Откуда:
Сообщений: 13148
DECLARE	crs
CURSOR	LOCAL READ_ONLY	FOR
SELECT	Field1		,
	Field2
FROM	Table1 

OPEN	crs

WHILE	1=1	BEGIN

	DECLARE	@Field1		TType1	,
		@Field2		TType2

	FETCH	NEXT
	FROM	crs 
	INTO	@Field1		,
		@Field2

	IF	@@FETCH_STATUS <> 0
		BREAK

	SELECT	@Field1		as [@Field1]	,
		@Field2		as [@Field2]

END

CLOSE		crs
DEALLOCATE	crs
25 июн 09, 17:23    [7344534]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
GSerg и другие,

Всё имеет своё обоснование. :)

Решаю усложненную версию данной проблемы.

Усложнение в том, что если в прошлом примере нужные записи можно было объединить по номеру страницы, то теперь номера страниц идут последовательно: 1,2,3,4,5 и т.д., поэтому сгруппировать или обновить по ним я не могу.

Единственный выход, который я в силу своих ограниченных познаний придумал, это пройти по результирующей таблице курсором, и обработать все поля (а в этой таблице обработок больше, чем в той из прошлого примера).

Поскольку полей много, то не хочется возиться с переменными.

В моем понимании обратиться напрямую - это выражение типа
[CursorName].[Field1] = [CursorName].[Field2]
, вместо того, чтобы делать
SET @Var1 = [CursorName].[Field1]
UPDATE SET [Field2] = @Var1 WHERE CURRENT OF [CursorName]

что касается кода - просто описываю ход мыслей, просьба не придираться.

Не знаю, к сожалению, что значит "на клиента". По возможности объясните в общих чертах.

П.С. Моя работа не связана с IT, так что не пинать!

Сообщение было отредактировано: 26 июн 09, 10:10
26 июн 09, 10:09    [7346296]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Version 8.0 SP4.
26 июн 09, 10:11    [7346300]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
Glory
Member

Откуда:
Сообщений: 104760
Eugene_p1
GSerg и другие,

Всё имеет своё обоснование. :)

Решаю усложненную версию данной проблемы.

Усложнение в том, что если в прошлом примере нужные записи можно было объединить по номеру страницы, то теперь номера страниц идут последовательно: 1,2,3,4,5 и т.д., поэтому сгруппировать или обновить по ним я не могу.


Хм. А в предыдущей теме в примере номера страниц разве непоследовательно идут ?
26 июн 09, 10:28    [7346410]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
Eugene_p1
Member

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

там записи можно объединить по номеру страницы. А в нынешней таблице из-за разницы форматов (старый-новый) страницы идут по-другому: где было 11111, 2222222, 333 теперь 12345, 1234567, 123.
То есть нумерация страниц каждый раз начинается заново.

Дык насчет курсора-то что-нибудь посоветуете?
26 июн 09, 11:58    [7347025]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
ыыыыы
Guest
да что тут советовать, нет такого синтаксиса в TSQL, как вам хочется. Переменные нужны,
плодите и размножайте!!
26 июн 09, 12:06    [7347084]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
Glory
Member

Откуда:
Сообщений: 104760
Eugene_p1
Glory,

там записи можно объединить по номеру страницы. А в нынешней таблице из-за разницы форматов (старый-новый) страницы идут по-другому: где было 11111, 2222222, 333 теперь 12345, 1234567, 123.
То есть нумерация страниц каждый раз начинается заново.

Путано как то все. Вы наверное считаете, что порядок записей на экране соответствует их физическому порядку в таблице ?
26 июн 09, 12:09    [7347107]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
ыыыыы
Guest
Crimean вам написал пример использования курсора, доработайте для себя
я бы только объявление за цикл вынес
26 июн 09, 12:09    [7347116]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
Eugene_p1
Member

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

я ж их сортирую в запросе, как мне надо.
И результат потом обрабатываю.
26 июн 09, 12:12    [7347136]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
Eugene_p1
Member

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

Ну у меня так и было сделано (именно декларирование вынесено :) ), пока не потребовалось объявлять полтора десятка переменных.
Похоже, придется плодить...

Хотел без курсора сделать - так и не придумал способ.
26 июн 09, 12:13    [7347152]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
Eugene_p1
Member

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

кстати, поскольку таблица составлена запросом
SELECT ... INTO ... ORDER BY
, думаю, порядок записей там соответствует. Ну надеюсь, по крайней мере. :)
26 июн 09, 12:15    [7347168]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
Glory
Member

Откуда:
Сообщений: 104760
Eugene_p1
Glory,

кстати, поскольку таблица составлена запросом
SELECT ... INTO ... ORDER BY
, думаю, порядок записей там соответствует. Ну надеюсь, по крайней мере. :)

Думать и знать - это разные вещи.
Даже если записи и попали в таблицу в определенном порядке то это не значит, что сервер вам теперь для каждого SELECT без ORDER BY будет выдавать их в этом же порядке
26 июн 09, 12:22    [7347218]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
Eugene_p1
Member

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

Согласен, поэтому я их сортирую принудительно.
26 июн 09, 12:26    [7347248]     Ответить | Цитировать Сообщить модератору
 Re: использование курсора  [new]
Glory
Member

Откуда:
Сообщений: 104760
Eugene_p1
Glory,

Согласен, поэтому я их сортирую принудительно.

И зачем тогда нужен курсор то ?
26 июн 09, 12:31    [7347291]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить