Sql-Server

創建一個 If-else 觸發器以根據原始表中的輸入將值輸入到另一個表中

  • July 29, 2022

我有兩張桌子。一個被稱為:TFiled_for_Office,其中包含 First Name、Last Name、Office、Party、Signatures 列。另一個是:TMustPayFee,包含 First Name、Last Name、Signatures、FeeStatus 列。我正在嘗試創建一個觸發器,當在 TFiled_for_Office 中輸入值時,如果輸入的簽名小於 500,則 FeeStatus 欄位將返回一個文本值,說明他們必須支付申請費。如果超過500,文字說他們可以繞過費用。

我得到的錯誤是:在預期條件的上下文中指定的非布爾類型的表達式,靠近’then’。也許我正在添加不應該存在的無關語法。這是我的查詢,讓我知道問題所在。謝謝!

CREATE TRIGGER Filing_Fee_Eligibility
  ON  TFiled_for_Office
  AFTER INSERT
AS 
BEGIN
declare @signatures int;
declare @First_Name varchar(20);
declare @Last_Name varchar(20);

SET NOCOUNT ON;
-- Insert statements for trigger here
SELECT @signatures = Signatures from inserted
SELECT @First_Name = @First_Name from inserted
SELECT @Last_Name = @Last_Name from inserted



if (select @signatures from TFiled_for_office where @signatures < '500')

then insert into TMustPayFee (First_Name, Last_Name, Signatures, FeeStatus) 
values (@First_Name, @Last_Name, @signatures, 'Candidate must pay filing fee of $2000')
else insert into TMustPayFee (First_Name, Last_Name, Signatures, FeeStatus)
values (@First_Name, @Last_Name, @signatures, 'Candidate eligible to bypass filing fee')
END
GO

在您的 IF 表達式中,您正在選擇行。與字元串文字比較時,該語句必須返回要正確評估的單行。這個假設是錯誤的。但是,如果您解決了更基本的問題,那麼 IF 語句和前面的分配只是有問題的並且不需要

您的程式碼存在一個常見缺陷。您假設觸發器按行執行。虛擬插入和刪除表可以包含任意數量的行 - 您必須編寫程式碼才能正常工作以處理任意數量的插入行。一個起點是:

CREATE TRIGGER Filing_Fee_Eligibility
  ON  dbo.TFiled_for_Office
  AFTER INSERT
AS 
SET NOCOUNT ON;

if exists (select * from inserted where Signatures < 500)
  insert into TMustPayFee (First_Name, Last_Name, Signatures, FeeStatus)
  select ... from inserted where Signatures < 500;

if exists (select * from inserted where Signatures >= 500)
   insert into TMustPayFee (First_Name, Last_Name, Signatures, FeeStatus)
   select ... from inserted where Signatures >= 500;
go

您可能想知道 IF 語句。即使 DML 語句不影響任何行(即,如果 SELECT 語句不返回任何行),與該類型的 DML 語句關聯的任何觸發器都將執行 - 並且虛擬觸發器表將為空。所以 IF 語句避免了這種情況。通常這是一個微不足道的優化,但最好避免不需要的工作。

注意要養成的好習慣。終止陳述。模式限定表名。避免隱式轉換。你寫了@signatures < '500'- 為什麼?該變數是 INT 並且您將其與字元串文字進行比較。

還要考慮如何定義您的要求。你寫了兩種情況——簽名小於 500 和簽名大於 500。當簽名正好是 500 時呢?我根據你的原始程式碼的編寫方式對此進行了更正。

TSQL if 語句就像

if (condition1) begin
...
end
else if (condition2) begin
...
end
else begin
...
end

沒有然後

引用自:https://dba.stackexchange.com/questions/314991