游标状态无效

时间:2011-02-17 04:26:06

标签: sql-server sql-server-2005 sap

我们在名为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 个答案:

答案 0 :(得分:3)

我算三个开始,三个结束。但它是代表游标循环的第二对 - 所以我将你的Close / Deallocate移动到第二个End之后,而不是之前。 E.g:

    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 行受影响的消息。