'cursor_name' 不存在

'cursor_name' does not exist

出于审计目的,我写了以下触发器。当我尝试更新 Sales.SalesOrderHeader table 中的记录时,出现以下错误:

Msg 16916, Level 16, State 1, Procedure tr_AuditUpdate, Line 11 A cursor with the name 'c_Audit2' does not exist.

这是触发器:

 USE [AdventureWorks2008R2]
    GO
    /****** Object:  Trigger [Sales].[tr_AuditUpdate]    Script Date: 9/19/2016 9:27:36 AM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER trigger [Sales].[tr_AuditUpdate]
    on [Sales].[SalesOrderHeader]
    for Update
    AS
    SET NOCOUNT ON
    BEGIN
    DECLARE @EntityCode1 int
    DECLARE @OldStatus1 nvarchar(100)
    DECLARE @NewStatus1 nvarchar(100)

    if @@ROWCOUNT>0
        DECLARE c_Audit2 CURSOR LOCAL FOR
        Select  d.SalesOrderID,d.Status,i.Status
        From    deleted AS d
        join inserted AS i
        on i.SalesOrderID=d.SalesOrderID
    Open c_Audit2


    Fetch Next From c_Audit2
    INTO @EntityCode1, @OldStatus1, @NewStatus1

    While @@FETCH_STATUS=0
    BEGIN
      execute sp_Audit @AuditedTable='Sales.SalesOrderHeader',
                       @EntityCode=@EntityCode1,
                       @OldStatus=@OldStatus1,
                       @NewStatus1=@NewStatus1,
                       @AuditUpdate='+',
                       @AuditInsert='-',
                       @AuditDelete='-'

      Fetch Next From c_Audit2
      INTO @EntityCode1, @OldStatus1, @NewStatus1
    END

    CLOSE c_Audit2
    DEALLOCATE c_Audit2
    END

这是更新语句

update Sales.SalesOrderHeader
set Status=4
where SalesOrderID=43659

只有在@@ROWCOUNT>0 时才会创建游标,正如您在触发器开头所写的那样。删除它 if 它将正常工作。

if @@ROWCOUNT>0
    DECLARE c_Audit2 CURSOR LOCAL FOR
    Select  d.SalesOrderID,d.Status,i.Status
    From    deleted AS d
    join inserted AS i
    on i.SalesOrderID=d.SalesOrderID
open c_Audit2 -- fails when @@rowcount=0

因为 if 游标不会总是被创建。

那么你的下一条语句是

open c_Audit2

如果“@@ROWCOUNT>0”returns false

,那将失败

删除此代码:如果@@ROWCOUNT>0,您的触发器将起作用。