Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL触发器错误-_Sql Server_Triggers - Fatal编程技术网

Sql server SQL触发器错误-

Sql server SQL触发器错误-,sql-server,triggers,Sql Server,Triggers,我正在尝试开发一个触发器,但似乎出现以下错误: 名为“CONTACT_cursor”的游标不存在。5339B6CC-5480-4B24-AC5D-3A4C0EAF64EC 3F0F445B-7BA3-4311-944A-E372D41FD307声明已终止 以下是我试图开发的触发器: USE [124959test] GO /****** Object: Trigger [dbo].[TRG_AUTOCAMPAIGN_Based_on_IDStatus_Value_Latest] Scri

我正在尝试开发一个触发器,但似乎出现以下错误:

名为“CONTACT_cursor”的游标不存在。5339B6CC-5480-4B24-AC5D-3A4C0EAF64EC 3F0F445B-7BA3-4311-944A-E372D41FD307声明已终止

以下是我试图开发的触发器:

USE [124959test]
GO
/****** Object:  Trigger [dbo].[TRG_AUTOCAMPAIGN_Based_on_IDStatus_Value_Latest]    Script Date: 05/28/2015 10:48:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[TRG_AUTOCAMPAIGN_Based_on_IDStatus_Value_Latest]
   ON  [dbo].[SN_Contact2]
   FOR INSERT, UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF (UPDATE(contact_category))  -- selector field is the one that determines if an action shou dbe taken
    BEGIN
        DECLARe @CAMPAIGNSTARTTIME datetime
        DECLARE @DELETEOLD INT
        DECLARE @TRIGGERFIELD VARCHAR(100)
        DECLARE @USERID VARCHAR(36)
        DECLARE @CONTACTID VARCHAR(36)
        DECLARE @CAMPAIGNID VARCHAR(36)
        DECLARE @SCHEDULEFOR VARCHAR(36)
        DECLARE @COMMINGLE VARCHAR(100)
        DECLARE @DROPSHIP VARCHAR(100)
        DECLARE @EDDM VARCHAR(100)
        DECLARE @EXPEDITEDDROPSHIP VARCHAR(100)
        DECLARE @EXPEDITEDSERVICES VARCHAR(100)
        DECLARE @FIRSTCLASS VARCHAR (100)
        DECLARE @FLATS VARCHAR(100)
        DECLARE @FREIGHTROVER VARCHAR(100)
        DECLARE @INTERNATIONAL VARCHAR(100)
        DECLARE @MAILROVER VARCHAR(100)
        DECLARE @OBBASHIP VARCHAR(100)
        DECLARE @OBBATRACK VARCHAR(100)
        DECLARE @PARCEL VARCHAR(100)
        DECLARE @PRODUCTION VARCHAR(100)

        SELECT @DELETEOLD = 0

        DECLARE CONTACT_CURSOR CURSOR FOR
            SELECT Contact_ContactID, SNL_RecordManagerID,contact_category,cust_commingle,CUST_Drop_Ship,
            cust_eddm,CUST_Expedited_Drop_Ship,CUST_Expedited_Services,CUST_First_Class,CUST_Flats,
            CUST_Freight_Rover,CUST_International,CUST_MailRover,CUST_OBBAShip,CUST_OBBATrack,
            CUST_Parcel,CUST_Production FROM inserted
            --where snl_recordmanagerid = '1C42B435-4A81-4109-A008-34AE91C2D48F'

        OPEN CONTACT_CURSOR
        FETCH NEXT FROM CONTACT_CURSOR 
            INTO @CONTACTID, @USERID, @TRIGGERFIELD, @COMMINGLE, @DROPSHIP, @EDDM, @EXPEDITEDDROPSHIP, @EXPEDITEDSERVICES,
             @FIRSTCLASS, @FLATS, @FREIGHTROVER, @INTERNATIONAL, @MAILROVER, @OBBASHIP, @OBBATRACK, @PARCEL, @PRODUCTION

        WHILE @@FETCH_STATUS = 0
        BEGIN
            IF @TRIGGERFIELD = 'Client' AND @USERID = '5339B6CC-5480-4B24-AC5D-3A4C0EAF64EC'
            --or @USERID = '277D668E-F18F-48E7-B7C1-2FDCF50F1B36'
        --or @USERID = '7FF6E867-8DDA-47FE-9A2F-E7E042FFAC56'
            /* This is to launch the New Client Workflow*/
            BEGIN
                SET @CAMPAIGNID = 'D25053D9-EF07-4184-98F5-EC6DB1814B7E' -- CampaignID of the New client Campaign
                SET @Campaignstarttime = getdate()
                EXEC usp_AssignCampaign @CONTACTID, @USERID, @CAMPAIGNID, @DELETEOLD, @CAMPAIGNSTARTTIME
            /* This is to launch the Send Welcome Package Workflow*/
            SET @CAMPAIGNID = '08118AC6-456B-4BEC-BD09-F09A0FDC893D' -- CampaignID of the Welcome Package Campaign.
            SET @Campaignstarttime = getdate()
            SET @USERID = '9E283EF8-208F-4A60-BACA-555F3BECEBAB' -- The UserID of to whom the to-do task will be scheduled to.
            EXEC usp_AssignCampaign @CONTACTID, @USERID, @CAMPAIGNID, @DELETEOLD, @CAMPAIGNSTARTTIME

            END

            ELSE
            BEGIN


            IF @TRIGGERFIELD = 'Prospect'
            BEGIN
                --Update sn_contact2 set cust_newsletter = Yes' -- When ID/Status = Prospect/Hot Prospect update Newsletter field to Yes.
                SET @CAMPAIGNID = 'B1649041-FB74-40D1-807C-F969D8AE4D40' -- CampaignID of the Opt-out Email with LinkedIn Follow Up Campaign
                SET @Campaignstarttime = getdate()
                EXEC usp_AssignCampaign @CONTACTID, @USERID, @CAMPAIGNID, @DELETEOLD, @CAMPAIGNSTARTTIME

            END

            ELSE
            BEGIN

              IF @TRIGGERFIELD = 'Hot Prospect'
            BEGIN
                --Update sn_contact2 set cust_newsletter = Yes' -- When ID/Status = Prospect/Hot Prospect update Newsletter field to Yes.
                SET @CAMPAIGNID = 'B1649041-FB74-40D1-807C-F969D8AE4D40' -- CampaignID of the Opt-out Email with LinkedIn Follow Up Campaign
                SET @Campaignstarttime = getdate()
                EXEC usp_AssignCampaign @CONTACTID, @USERID, @CAMPAIGNID, @DELETEOLD, @CAMPAIGNSTARTTIME
            end
            end

            FETCH NEXT FROM CONTACT_CURSOR 
                INTO @CONTACTID, @USERID, @TRIGGERFIELD, @COMMINGLE, @DROPSHIP, @EDDM, @EXPEDITEDDROPSHIP, @EXPEDITEDSERVICES,
             @FIRSTCLASS, @FLATS, @FREIGHTROVER, @INTERNATIONAL, @MAILROVER, @OBBASHIP, @OBBATRACK, @PARCEL, @PRODUCTION
        END

        CLOSE CONTACT_CURSOR
        DEALLOCATE CONTACT_CURSOR
    END
end
end
有什么想法吗?

我想你找错地方了。它将您的下一个获取推到游标声明的范围之外。尝试将代码结尾修改为以下内容

                BEGIN
                        --Update sn_contact2 set cust_newsletter = Yes' -- When ID/Status = Prospect/Hot Prospect update Newsletter field to Yes.
                        SET @CAMPAIGNID = 'B1649041-FB74-40D1-807C-F969D8AE4D40' -- CampaignID of the Opt-out Email with LinkedIn Follow Up Campaign
                        SET @Campaignstarttime = getdate()
                        EXEC usp_AssignCampaign @CONTACTID, @USERID, @CAMPAIGNID, @DELETEOLD, @CAMPAIGNSTARTTIME
                    end
                end
            END 
            FETCH NEXT FROM CONTACT_CURSOR 
                INTO @CONTACTID, @USERID, @TRIGGERFIELD, @COMMINGLE, @DROPSHIP, @EDDM, @EXPEDITEDDROPSHIP, @EXPEDITEDSERVICES,
             @FIRSTCLASS, @FLATS, @FREIGHTROVER, @INTERNATIONAL, @MAILROVER, @OBBASHIP, @OBBATRACK, @PARCEL, @PRODUCTION

        END
        CLOSE CONTACT_CURSOR
        DEALLOCATE CONTACT_CURSOR
    END
end

代码有几个问题。首先,您需要在匹配开始之前移动FETCH,然后在WHILE之后移动FETCH。下一件事是,你需要靠近并释放到外部

                        FETCH NEXT FROM CONTACT_CURSOR 
                        INTO @CONTACTID, @USERID, @TRIGGERFIELD, @COMMINGLE, @DROPSHIP, @EDDM, @EXPEDITEDDROPSHIP,
                        @EXPEDITEDSERVICES, @FIRSTCLASS, @FLATS, @FREIGHTROVER, @INTERNATIONAL, @MAILROVER,
                        @OBBASHIP, @OBBATRACK, @PARCEL, @PRODUCTION
                END
            CLOSE CONTACT_CURSOR
            DEALLOCATE CONTACT_CURSOR
        END
END
这是光标的基本轮廓

DECLARE Some_Cursor CURSOR

OPEN Some_Cursor
FETCH NEXT FROM Some_Cursor

WHILE @@FETCH_STATUS = 0
    BEGIN 

        FETCH NEXT FROM Some_Cursor
    END

CLOSE Some_Cursor
DEALLOCATE Some_Cursor

感谢所有的帮助!我已经使这个触发器运行,在我验证它是否正常工作后,我将改进或重新构造它,使它不再使用联系人游标

谢谢你的帮助

再次感谢


-Mike

除非必须,否则不要在触发器内使用光标。这是一个表演杀手。哎哟!!!一切都是硬编码的guid。维护这个会很糟糕。您应该使用查询来查找所有这些值。我当然希望所有这些guid都不是你的聚集索引。大家好,非常感谢你们的帮助、指导和启发,似乎这是一个错误的结束语句。