Вы не хотите использовать курсор, вы хотите сделать это как набор, например так:
update p set
packageNo = r.packageNo
from
packages p
inner join
(select orderNo, orderLineNo,
ROW_NUMBER() OVER(PARTITION BY orderNo ORDER BY orderLineNo) as packageNo
from packages) r on
p.orderNo = r.orderNo
and p.orderLineNo = r.orderLineNo
Это позволит использовать функцию ROW_NUMBER
в SQL Server дляполучить правильный счет по каждой строке.Используя UPDATE...FROM
, мы можем создать inner join
для обновления.Это значительно эффективнее, чем курсор.
См., Курсоры добавляют итеративную возможность в процедурный и основанный на языке (SQL) язык.Эти двое плохо играют вместе.Этот оператор update
вызывается для каждой строки (и открытия / совершения транзакции для загрузки).Если вы делаете все это в одном операторе, SQL может распараллелить это, чтобы сделать его намного быстрее.
Стандартное правило таково: Используйте курсоры как можно реже. В некоторых случаях существует несколькоони необходимы, но если вы не занимаетесь огромным количеством администрирования SQL в день, сомнительно, что вы когда-нибудь сталкивались с такими случаями.