Ошибка при update where current of

maximF
Дата: 25.10.2000 15:14:01
При попытке выполнить следующий код (он выглядит немного экзотично, но в принципе может быть полезен), у меня генерится после удивительно долгого раздумья такой errror:
ODBC: Msg 0, Level 19, State 1
SqlDumpExceptionHandler: Process 9 generated fatal exception c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this process.

Ошибка возникает в строке "update #a set @j=i=2 where current of cBase"
Интересно, это какая-то особенность моей конфигурации или очередной микрософтовский баг?

А вот и сам код:
/********************************/
create table #a(i int)
insert #a values(12)

declare cBase cursor for select i from #a
open cBase

declare @i int, @j int

fetch next from cBase into @i
update #a set @j=i=2 where current of cBase

close cBase
deallocate cBase
/********************************/

С уважением, Максим
Fompro
Дата: 25.10.2000 16:05:38
update #a set @j=2,i=@j where current of cBase
SELECT * FROM #a
Смотрим и удивляемся ...
maximF
Дата: 01.11.2000 11:36:48
Было бы здорово, если бы кто-то прогнал вышеприведенный код на своем SQL-сервере и написал, что вышло.
Как видно этот код независит от внешних объектов и вообче неопасный.

Спасибо, Максим.
Fompro
Дата: 01.11.2000 12:44:37
Простите, не имею привычки посылать скрипты, которые не были выполнены.
Кстати, этот выполняется как на 2000, так и на 6.5
SergSuper
Дата: 01.11.2000 13:19:51
Та же фигня и у меня. Похоже это их залепуха. Причем залепуха по-моему в том, что компилятор пропускает присваивания типа @j=i=2. Я чего-то не видел что бы было описано, что так можно писать. Например i=@j=2 не проходит.
maximF
Дата: 01.11.2000 13:43:59
По предыдущим репликам:
1. Я выполнял этот batch на MS SQL 7.0 на двух разных серверах - ошибка была. Насчёт MS SQL 6.5, 2000 ничего сказать не могу.
2. Не понял, что имел в виду уважаемый Fompro, когда говорил "Простите, не имею привычки посылать скрипты, которые не были выполнены".
3. Синтаксис update ... set @variable=column=expression допустим (см. Books Online), в отличие от update ... set column=@variable=expression.
4. Так что ошибка вызывает, по всей видимости, сочетание операции из пункта 3, и апдейта с использованием курсора.

Максим.
Fompro
Дата: 01.11.2000 20:51:40
Простите, видимо не понял Ваше предыдущее замечание. Синтаксис set @variable=column=expression вызывает ошибку во всех версиях.
Stork
Дата: 04.11.2000 05:03:07
Прогонял исходный код и код с исправлениями (первый ответ) на 6.5. Оба работают идентично, не выдавая никаких ошибок. На 7.0 потребовалось вместо
create table #a(i int)
написать
create table #a(i int not null)
Все работало идентично в обоих вариантах, однако для варианта с
update #a set @j=2,i=@j where current of cBase
не требовалось исправлять строку создания таблицы, ибо конфликта null и not null типов уже не было.

С уважением,
Александр
maximF
Дата: 04.11.2000 15:37:30
Первоначальная версия кода была синтаксически правильной.
Cинтаксис update ... set @variable=column=expression допустим.
Цитата из Books Online:
UPDATE
{
table_name WITH ( <table_hint_limited> [...n])
| view_name
| rowset_function_limited
}
SET
{column_name = {expression | DEFAULT | NULL}
| @variable = expression
| @variable = column = expression } [,...n]

{{[FROM {<table_source>} [,...n] ]
и т.д.
Такой синтаксис может использоваться для присваивания колонке [table.i] последовательных целых значений (как это было указано в одном из номеров рассылки по MS SQL на subscribe.ru):
declare @counter=0
update [table] set @counter=i=@counter+1.

Исправленный вариант (ответ №1) никакого интереса не представляет, поскольку не вызывает ошибки при исполнении.
Fompro
Дата: 07.11.2000 17:31:15
Я надеялся, что дискуссия закончена, но ...
Последняя фраза сильно смутила меня.
"никакого интереса не представляет, поскольку не вызывает ошибки при исполнении."
Так в чём смысл написания программы (запроса, ...)? Вызвать ошибку? Или всё-таки написать правильную конструкцию?
Конструкция update ... set @variable=column=expression действительно допустима ...
Но! Только в чистом UPDATE. Применение её в курсоре приводит к вышеописанной ошибке. Надеюсь, все согласятся, что работа в рамках курсора зто отдельная песнь. А Books Online - не священная корова.
Остаюсь и проч. ...