簡體   English   中英

在 SQL 服務器觸發器中包含 If 語句?

[英]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 或其他一些機制來聚合字符串。

我也刪除了觸發器的UPDATEDELETE部分。 您當然不能在DELETE上為客戶獲得新的預訂。 UPDATE上,它更值得懷疑。 但是,很難(但並非不可能)區分對單個記錄的更改和插入單個記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM