Курсор не увеличивает обновляемую строку с начальным значением - PullRequest
1 голос
/ 30 сентября 2011

Я очень новичок в SQL Server. Я использую курсор для заполнения таблицы с идентификаторами; Я только что обнаружил курсоры сегодня. Код выполняется, но он заполняет каждую строку начальным значением.

SET NOCOUNT ON
DECLARE  @Irow  int    
declare @cheese int;
set @cheese = (select (max(balanceid) + 1) from balancetbl)
DECLARE aurum CURSOR FOR
SELECT    @Irow
FROM      aurumaugupload
OPEN aurum
FETCH aurum INTO @Irow
WHILE @@Fetch_Status = 0
BEGIN
update aurumaugupload set balanceid = @cheese
set @cheese = @cheese + 1;
FETCH aurum INTO @Irow             
END
CLOSE aurum
DEALLOCATE aurum
RETURN

Я думаю, что это действительно основная ошибка, но я не вижу ее из-за своей неопытности.

ОБНОВЛЕНИЕ: спасибо, ребята, за ваши ответы на вопросы. Я получил это работает после помощи nonnb. Вот окончательный код:

SET NOCOUNT ON
DECLARE  @acc  int    
declare @start int;
set @start = (select (max(balanceid) + 1) from balancetbl)
DECLARE aurum CURSOR FOR
SELECT    accountid
FROM      aurumaugupload
OPEN aurum
FETCH aurum INTO @acc
WHILE @@Fetch_Status = 0
BEGIN
update aurumaugupload set balanceid = @start where accountid = @acc
set @start = @start + 1;
FETCH aurum INTO @acc          
END
CLOSE aurum
DEALLOCATE aurum
RETURN

Ответы [ 3 ]

1 голос
/ 30 сентября 2011

Здесь есть как минимум 2 ошибки:

Ошибка 1

DECLARE aurum CURSOR FOR
SELECT    @Irow
FROM      aurumaugupload

выберет одинаковую (унифицированную) константу для каждого ряда aurumaugupload. Вам нужно что-то вроде

SELECT    Irow
FROM      aurumaugupload

Ошибка 2 - Вы обновляете все строки внутри курсора.Вам нужно где

update aurumaugupload set balanceid = @cheese
where IRow = @IRow;

set @cheese = @cheese + 1
1 голос
/ 30 сентября 2011

Ваш оператор обновления не имеет предложения where, поэтому вы обновляете каждую строку каждый раз.

0 голосов
/ 30 сентября 2011

Попробуйте это решение (если порядок сортировки / обновления не имеет значения):

SET NOCOUNT ON
DECLARE  @Irow  int    
DECLARE @cheese int;
SET @cheese = (SELECT (MAX(balanceid) ) FROM balancetbl)

UPDATE aurumaugupload 
set    @cheese = balanceid = @cheese+1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...