創建一個 If-else 觸發器以根據原始表中的輸入將值輸入到另一個表中
我有兩張桌子。一個被稱為: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
沒有然後