SQL Server CURSOR не работает - PullRequest
       2

SQL Server CURSOR не работает

1 голос
/ 17 декабря 2011

Требуется курсор для обновления значения из другой сохраненной заготовки и обновления только выбранных значений

У меня есть следующее:

DECLARE upd_cursor CURSOR FOR
SELECT * FROM Terr
WHERE Text = "RightT" ;

OPEN upd_cursor;

-- Perform the first fetch.
FETCH NEXT FROM upd_cursor;

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN

 exec usp_Gent  @valback OUTPUT; 
 update Terr  
 set Text = @valback

FETCH NEXT FROM upd_cursor;
END

CLOSE upd_cursor;
DEALLOCATE upd_cursor;
GO

В моем случае обновляются все поля в таблице. Что я делаю не так

Ответы [ 3 ]

3 голосов
/ 17 декабря 2011

В вашем выражении update нет положения where.

В более общем смысле для этого следует использовать одно предложение update, а не курсор:

exec usp_Gent @valback OUTPUT;
update Terr set
    Text = @valback
where
    Text = 'RightT';

Если вы не usp_Gent делаете то, что мне не хватает.

Причина, по которой вам нужно одно предложение вместо одного для каждой строки , заключается в том, что SQL лучше мыслит в наборах. Каждый update имеет свои накладные расходы - он открывает транзакцию, записывает, что он делает, и затем фиксирует эту транзакцию. Это очень медленно, если вам приходится делать тысячи таких. То, что вы действительно хотите сделать, это просто обновить тысячи строк одновременно - это то, что базы данных делают с реляционной алгеброй, и они действительно, действительно хороши в этом. Думай по сетам, а не по порядку.

3 голосов
/ 17 декабря 2011
update Terr  
set Text = @valback

Вы не устанавливаете условие WHERE в этом выражении.

Кроме того, почему вы используете курсоры?

1 голос
/ 17 декабря 2011

Если вы действительно хотите сделать построчное обновление, вы можете использовать синтаксис CURRENT OF. Это было бы в том случае, если ваш вызов хранимой процедуры возвращал разные результаты для каждого.

, например

     update Terr  
     set Text = @valback
     WHERE CURRENT OF upd_cursor
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...