【问题标题】:Cursor Trigger - A cursor with name mycursor doesn't exist光标触发器 - 名为 mycursor 的光标不存在
【发布时间】:2015-11-29 11:02:24
【问题描述】:

当我尝试插入表时,它给出错误 SQL Server 抛出错误:

名为 mycursor 的游标不存在。

这是我的代码

ALTER TRIGGER [dbo].[tg_cr_groups]
   ON  [dbo].[masterheader]
   AFTER insert
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    -- Insert statements for trigger here
    Declare @mhID tinyint
    Select @mhID=masterheaderID from inserted
    Declare @mhcode nvarchar(50)
    Select @mhcode=masterheadercode from inserted
    Declare mycrusor CURSOR FOR SELECT masterheaderID, masterheadercode FROM inserted;
    open mycursor;
    FETCH NEXT FROM mycursor into @mhID, @mhcode;
    WHILE @@FETCH_STATUS=0
    Begin
        IF  @mhcode='INC'
        Begin
            insert into groups
            Values
            ('Groupnameone','GRP-1',@mhID,1,1,1,1,1,NULL,getdate(),NULL,getdate(),1),
            ('Groupnametwo','GRP-2',@mhID,1,1,1,1,1,NULL,getdate(),NULL,getdate(),1),
            ('Groupnamethree','GRP-3',@mhID,1,1,1,1,1,NULL,getdate(),NULL,getdate(),1)
        End
        Else IF @mhcode='EXP'
        Begin
            insert into groups
            Values
            ('Groupnamefour','GRP-4',@mhID,1,1,1,1,1,NULL,getdate(),NULL,getdate(),1),
            ('Groupnamefive','GRP-5',@mhID,1,1,1,1,1,NULL,getdate(),NULL,getdate(),1),
            ('Groupnamesix','GRP-6',@mhID,1,1,1,1,1,NULL,getdate(),NULL,getdate(),1)
        End
        Else IF @mhcode='AST'
        Begin
            insert into groups
            Values
            ('Groupnameseven','GRP-7',@mhID,1,1,1,1,1,NULL,getdate(),NULL,getdate(),1),
            ('Groupnameeigh','GRP-8',@mhID,1,1,1,1,1,NULL,getdate(),NULL,getdate(),1),
            ('Groupnamenine','GRP-9',@mhID,1,1,1,1,1,NULL,getdate(),NULL,getdate(),1)
        End
            Else IF @mhcode='LIB'
        Begin
            insert into groups
            Values
            ('Groupnameten','GRP-10',@mhID,1,1,1,1,1,NULL,getdate(),NULL,getdate(),1),
            ('Groupnameeleven','GRP-11',@mhID,1,1,1,1,1,NULL,getdate(),NULL,getdate(),1),
            ('Groupnametwelve','GRP-12',@mhID,1,1,1,1,1,NULL,getdate(),NULL,getdate(),1)
        End
    END
    FETCH NEXT FROM mycursor into @mhID, @mhcode;
    close mycursor;

END

【问题讨论】:

  • 请:不要在触发器中使用光标!这是您可以对您的系统做的绝对最差!触发器应该小、快、灵活——光标不是这样的!避免在触发器中进行繁重的工作和大量处理 - 只需记下要做的事情 - 但实际上不要在触发器中执行那个长时间运行的进程!这将杀死您的系统性能!光标也不是必需的 - 它可能占所有情况的 95% 以上 - 绝对不是这里!

标签: sql-server triggers cursor


【解决方案1】:

您的光标不存在,因为您已将其声明为mycrusor 而不是mycursor。但我建议您在没有光标的情况下执行此操作。

您的代码还有一个严重问题,您从插入的变量中获取值,当插入多行时,该变量无法正常工作。

你的 fetch next 在 while 循环之外。

【讨论】:

    猜你喜欢
    • 2018-05-27
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多