[英]Include an If statement in a SQL Server trigger?
我目前在數據庫管理 class 中苦苦掙扎。 我的任務是創建一個觸發器,如果客戶第一次進行預訂,它會打印一條消息。 到目前為止,我的代碼如下
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;
這會引發錯誤:
消息 156,級別 15,State 1,過程 ResNewTrigger,第 20 行 [批處理開始第 7 行]
關鍵字“THEN”附近的語法不正確。消息 102,級別 15,State 1,過程 ResNewTrigger,第 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;
這使用string_agg()
將 cid 連接在一起。 在 SQL 服務器的早期版本中,您需要 UDF 或其他一些機制來聚合字符串。
我也刪除了觸發器的UPDATE
和DELETE
部分。 您當然不能在DELETE
上為客戶獲得新的預訂。 在UPDATE
上,它更值得懷疑。 但是,很難(但並非不可能)區分對單個記錄的更改和插入單個記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.