0

当登记表中有插入时,我需要减少表计划中的计数器:

CREATE TRIGGER [UpdateEnrollmentsTrigger]
ON [TBLENROLLMENT_ENR]
FOR INSERT
AS
BEGIN
    DECLARE @ScheduleCode NVARCHAR
    DECLARE @TotalSlots INT

    IF EXISTS(SELECT SCH_CODE FROM inserted)
        BEGIN
            SELECT @ScheduleCode = SCH_CODE FROM inserted

            SELECT @TotalSlots = SCH_TOTALSLOTS FROM TBLSCHEDULES_SCH
            WHERE SCH_CODE = @ScheduleCode

            UPDATE TBLSCHEDULES_SCH
            SET SCH_FREESLOTS = @TotalSlots - 1
            WHERE SCH_CODE = @ScheduleCode
        END
END

当我尝试创建此触发器时,VS12 的查询窗口显示:

SQL46010 :: Incorrect syntax near ].

提前致谢。

4

1 回答 1

1

具体错误是因为您使用的是FOR INSERT代替AFTER INSERT,但是您应该在触发器上改进其他一些事情。

首先,总是,总是写 a 的长度NVARCHAR,将其留空会根据使用的位置而有所不同。所以替换DECLARE @ScheduleCode NVARCHAR为,所需的长度DECLARE @ScheduleCode NVARCHAR(n)在哪里。n

我也不确定你为什么要这样做,IF EXISTS因为它正在读取INSERTED伪表,因为触发器被触发,所以它一定会有记录。

要改进的另一件事是,您假设只插入了一行,因为您将它存储在一个变量中,这是错误的,如果您插入的不止一行,它的行为就会不正确。

哦,我差点忘了,您还应该始终指定架构,例如:CREATE TRIGGER [UpdateEnrollmentsTrigger] ON [TBLENROLLMENT_ENR]应该是CREATE TRIGGER dbo.[UpdateEnrollmentsTrigger] ON dbo.[TBLENROLLMENT_ENR](当然,使用正确的架构)

于 2013-07-18T16:25:54.883 回答