我们在名为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
但仍然会得到同样的错误。
你们有什么问题吗?
提前致谢!
答案 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 行受影响的消息。