是否在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不知道如何写入正确的触发器。