是否在SQL Server触发器中包含If语句?

是否在SQL Server触发器中包含If语句?,sql,sql-server,triggers,Sql,Sql Server,Triggers,我目前正在数据库管理课程中苦苦挣扎。我的任务是创建一个触发器,在客户第一次预订时打印消息。到目前为止,我的代码如下 ALTER TRIGGER [dbo].[ResNewTrigger] ON [dbo].[Reservation] AFTER INSERT, DELETE, UPDATE AS BEGIN SET NOCOUNT ON; DECLARE @cid CHAR(4) DECLARE @res_counts INT SELECT

我目前正在数据库管理课程中苦苦挣扎。我的任务是创建一个触发器,在客户第一次预订时打印消息。到目前为止,我的代码如下

ALTER TRIGGER [dbo].[ResNewTrigger] 
ON [dbo].[Reservation] 
AFTER INSERT, DELETE, UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @cid CHAR(4)   
    DECLARE @res_counts INT    
    SELECT @cid = CustomerNum FROM inserted    

    SELECT @res_counts = COUNT(*) 
    FROM dbo.Reservation 
    WHERE CustomerNum = @cid 

    IF @res_counts = 0 THEN
        PRINT  'A reservation is made for the first time from customer' + @cid;
    END IF;
END;
这会引发以下错误:

Msg 156,15级,状态1,程序重新装配,第20行[批次开始第7行] 关键字“THEN”附近的语法不正确

Msg 102,15级,状态1,程序重新装配,第22行[批次开始第7行] “;”附近的语法不正确

我一定不知道正确的语法或其他什么,但我在找到如何解决此问题时运气不佳。

IF语句中的语法错误是您在触发器方面遇到的最小问题。请参阅以更正IF语句

您的触发器错误,因为您假定inserted有一行。这样的假设从来都不安全

ALTER TRIGGER [dbo].[ResNewTrigger] 
   ON  [dbo].[Reservation] 
   AFTER INSERT
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @cids VARCHAR(MAX);

    -- Insert statements for trigger here
    SELECT @cids = STRING_AGG(i.cid, ', ')
    FROM inserted i JOIN
         Reservation r
         ON r.customerNum = i.customerNum
    GROUP BY i.cid
    HAVING COUNT(*) = 1;   -- this row is already in reservation
    IF @cids <> ''
    BEGIN
        PRINT  'A reservation is made for the first time from customer(s) ' + @cids;
    END;
END;
这将使用字符串_agg将CID连接在一起。在SQL Server的早期版本中,需要UDF或其他某种机制来聚合字符串


我删除了更新并删除了触发器的一部分。您当然无法在删除时为客户获得新预订。从最新情况来看,这更值得怀疑。但是,很难但并非不可能区分对单个记录的更改和插入单个记录。

一个问题是,您假设插入的记录中只有一行—您永远无法做到这一点,因为插入的记录将包含更新/插入的行数,并且您必须能够处理这一点。有许多SQL Server触发器教程介绍了如何触发。如果您检查If/begin/end,则不以then开头,也不以end If结尾。您需要养成检查文档的习惯。否则,您需要习惯别人告诉您使用rtfm。一切都只是谷歌的一个例子,我很惊讶这怎么会被否决。是否有人匿名建议不考虑插入的行可能有多行?@DaleK。如果只处理语法错误,则会留下一个带有主要错误的触发器。这似乎是更大的问题。OP不知道如何写入正确的触发器。