当注册表中有插入时,我需要减少表计划中的计数器:
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 ].
提前致谢。
答案 0 :(得分:1)
具体错误是因为您使用的是FOR INSERT
而不是AFTER INSERT
,但还有其他一些因素需要改进。
首先,始终始终写出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]
(当然使用正确的架构)