powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать курсор для update???
14 сообщений из 14, страница 1 из 1
Как сделать курсор для update???
    #32035546
noname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил заюзать курсор все хорошо отлично если мне нужно читать но теперь мне нужно не просто читать а и по ходу
update-тить курсор, создаю курсор такого типа и пишет ошибку что этот курсор Read only, в чем дело???


DECLARE SystemPrice_cursor CURSOR FOR
SELECT * FROM SystemPrice
where sp_id=@rp_id
order by sp_id,sp_perid
for Update of sp_delta
...
Рейтинг: 0 / 0
Как сделать курсор для update???
    #32035551
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня была похожая проблема,решал следующим образом:
SELECT * FROM into #temp SystemPrice
where sp_id=@rp_id
order by sp_id,sp_perid
потом курсор по #temp,и update проходит нормально.
Решение конечно не из лутших ,но работает:))
Может кто-то из более опытных подскажет как настроить cursor для update правильно,но я сколько не пробыывал у меня постоянно ругаеться MDTS:(
...
Рейтинг: 0 / 0
Как сделать курсор для update???
    #32035552
Sanek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в BOL
Поиск : слово cursor
раздел: DECLARE CURSOR
...
Рейтинг: 0 / 0
Как сделать курсор для update???
    #32035553
Sanek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только предупреждаю :
Такие шутки приводят к зависанию SQL сервера ....
даже если запрос написан нормально ....
...
Рейтинг: 0 / 0
Как сделать курсор для update???
    #32035555
noname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может скомпилишь чего там не так ???
...
Рейтинг: 0 / 0
Как сделать курсор для update???
    #32035559
Sanek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так у меня работает :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
use Northwind

CREATE TABLE Categories2
       (
	CategoryID int NOT NULL ,
	CategoryName  varchar( 15 )
       )



insert inTo Categories2
Select CategoryID,
       CategoryName 
  from Categories


Declare @CategoryID int,
 	@CategoryName varchar( 15 )

DECLARE cursor_name CURSOR 
FOR  Select CategoryID,CategoryName 
       from Categories2
      where CategoryID >  0 

OPEN cursor_name
FETCH NEXT FROM cursor_name into @CategoryID,@CategoryName
WHILE (@@fetch_status <> - 1 )
BEGIN
if @CategoryID >  0  
	begin
	update Categories2 set CategoryID =  0  where CategoryID = @CategoryID
	end

FETCH NEXT FROM cursor_name into @CategoryID,@CategoryName
END
CLOSE cursor_name
DEALLOCATE cursor_name


PS
Вообще так работать недолжно ... :)
...
Рейтинг: 0 / 0
Как сделать курсор для update???
    #32035580
noname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ясный перец что так должно работать( я тоже так думал сделать) но это двойная работа, похорошему поидее можна апдейтить через курсор, а не через отдельный запрос, если я все правильно понял из help.
...
Рейтинг: 0 / 0
Как сделать курсор для update???
    #32035583
noname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И я боюсь не то что оно там будет дольше работать, а больше боюсь не возникнут ли deadlock-и???
...
Рейтинг: 0 / 0
Как сделать курсор для update???
    #32035589
Sanek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. ты хочеш открыть курсор и в процессе пробега по этому курсору хочеш менять его (и содержимое самого selecta) ?
мне кажеться так нельзя ...

нечто подобного можно добиться
Код: plaintext
1.
2.
3.
4.
update Table
     set Table.Column = newtable.column1
   from  newTable
where Table.ColumnID = NewTable.ColumnID2
...
Рейтинг: 0 / 0
Как сделать курсор для update???
    #32035592
Rom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BOL:
DECLARE CURSOR
Defines a cursor for row-at-a-time data retrieval.

Syntax
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR FOR {select_stmt | prepared_stmt_name} [FOR { READ ONLY | UPDATE [ OF column_list ] } ]
...
Рейтинг: 0 / 0
Как сделать курсор для update???
    #32035601
noname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это я тоже видел, пришли лучше example, а не кусок help-a
...
Рейтинг: 0 / 0
Как сделать курсор для update???
    #32035614
Rom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если впадлу по BOL полазить, то держи

drop table #Tmp
go
create table #Tmp (col int)
insert into #Tmp values(1)
insert into #Tmp values(2)
insert into #Tmp values(3)

declare @i int

declare abc cursor for
select col from #Tmp
for update

open abc

fetch next from abc into @i

WHILE @@FETCH_STATUS = 0
begin
print @i
update #Tmp
set col = -@i
where
current of abc

fetch next from abc into @i
end
close abc
deallocate abc

select * from #Tmp
...
Рейтинг: 0 / 0
Как сделать курсор для update???
    #32035619
noname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это намного лучше чем
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR FOR {select_stmt | prepared_stmt_name} [FOR { READ ONLY | UPDATE [ OF column_list ] } ]

Спасибо, я сделал то что хотел...
...
Рейтинг: 0 / 0
Как сделать курсор для update???
    #32035664
Robert Djabarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
How about trying to do it without a cursor? Highly discourage using this ugly Oracle method of processing a resultset using record-level approach! It's not for nothing that cursors are viewed in Transact-SQL as the method of last resourt.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать курсор для update???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]