Неверное состояние курсора - PullRequest
0 голосов
/ 17 февраля 2011

У нас есть триггеры в таблице OSPP для сохранения определенных данных в таблице для последующего использования. Я получаю следующую ошибку в SAP при добавлении в таблицу более одной строки за раз.

Недопустимое состояние курсора

У нас есть SQL Server 2005 SP3 (но я пробовал его на чистой установке 2005 года, на SP1 и SP2)

Один триггер:

CREATE TRIGGER [dbo].[tr_OSPP_Insert]
   ON  [dbo].[OSPP]
   FOR INSERT
AS 
BEGIN
    Declare @ItemCode varchar(255)
    Declare @CardCode varchar(255)
    Declare @Price decimal(18,2)
    Declare @ListNum bigint 
    Declare @ID bigint
    Declare @Remote char(1)


    DECLARE db_cursor CURSOR FOR 
    SELECT ItemCode, CardCode, Price, ListNum
    FROM INSERTED

    OPEN db_cursor  
    FETCH NEXT
    FROM db_cursor  INTO @ItemCode, @CardCode, @Price, @ListNum
    WHILE @@FETCH_STATUS = 0
    BEGIN

    SELECT @Remote = isnull(U_Remote, 'N') FROM OITM WHERE ItemCode = @ItemCode

        IF ltrim(rtrim(upper(@Remote))) = 'Y'
        BEGIN

        SELECT @ID = U_ID FROM [dbo].[@BDS_MAINTENANCE]
        UPDATE [dbo].[@BDS_MAINTENANCE] set U_ID = U_ID + 1

        INSERT INTO [dbo].[@BDS_REMOTESPECIALPRICELIST]
        (   
            Code,
            [Name],
            U_ID,
            U_ItemCode,
            U_CardCode,
            U_Price,
            U_ListNum,
            U_TransactionType,
            U_Uploaded
        ) VALUES (
            @ID,
            '_' + cast(@ID as VARCHAR(50)),
            @ID,
            @ItemCode,
            @CardCode,
            @Price,
            @ListNum,
            1,
            0
        )


    FETCH NEXT
    FROM db_cursor INTO @ItemCode, @CardCode, @Price, @ListNum
    END

    CLOSE db_cursor  
    DEALLOCATE db_cursor


END

END

Мы также пытались:

CREATE TRIGGER [dbo].[tr_OSPP_Insert]
   ON  [dbo].[OSPP]
   FOR INSERT
AS 
BEGIN

    SELECT * INTO [@TEMPTABLE222] FROM INSERTED 

END

Но все равно получите ту же ошибку.

Ребята, вы понимаете, что не так?

Заранее спасибо!

1 Ответ

3 голосов
/ 17 февраля 2011

Я считаю три Начала и три Конца.Но это вторая пара, которая представляет цикл курсора - поэтому я бы переместил ваш Close / Deallocate после второго End, а не до.Например:

    FETCH NEXT
    FROM db_cursor INTO @ItemCode, @CardCode, @Price, @ListNum
    END

    CLOSE db_cursor  
    DEALLOCATE db_cursor
END

Вероятно, должно быть:

    END
    FETCH NEXT
    FROM db_cursor INTO @ItemCode, @CardCode, @Price, @ListNum

END
CLOSE db_cursor  
DEALLOCATE db_cursor

(я также переместил выборку на следующий уровень вперед, так как в противном случае вы только перемещаете курсор вперед внутри вашего условия IF)


И один комментарий стиля (не могу устоять).Как правило, рекомендуется использовать SET NOCOUNT ON в теле триггера, чтобы избежать отправки большого количества дополнительных сообщений, затронутых n строк.

...