CREATE OR ALTER TRIGGER CheckQuantity
ON dbo.Products
AFTER UPDATE
AS
BEGIN
UPDATE dbo.Products
SET Product_ReOrder = 1
FROM Inserted i
WHERE i.Product_ID = dbo.Products.Product_ID
AND i.Product_QOH < 5;
我沒有收到語法錯誤
附近的語法錯誤;
這是指;代碼末尾的 。
uj5u.com熱心網友回復:
不能 100% 確定您要做什么 - 您也沒有給我們太多的作業要做!
我假設您的意思是如果另一列小于 5,您想將表中呼叫的列設定Product_ReOrder為 1 Product_QOH- 正確嗎?
在這種情況下 - 使用這樣的觸發器:
CREATE OR ALTER TRIGGER CheckQuantity
ON dbo.Products
AFTER UPDATE
AS
BEGIN
UPDATE dbo.Products
SET Product_ReOrder = 1
FROM Inserted i
WHERE i.PrimaryKeyColumn = dbo.Products.PrimaryKeyColumn
AND i.Product_QOH < 5;
END
觸發器將在UPDATE,之后觸發,Inserted并將包含已更新的所有行(可以并且將是多行!) - 所以我假設您想檢查這些行的數量。
我將基表 ( dbo.Products) 連接到Inserted表的主鍵列上的偽表(我們不知道它是什么 - 所以你需要根據需要調整它),我將Product_ReOrder列設定為1,如果Products_QOH值小于 5。
你的代碼行
Select @QOH = (select Product_QOH from inserted)
假設只有一行被更新有一個致命的缺陷——有時可能是這種情況——但你不能依賴它!您的觸發器必須能夠處理被更新的多行——因為觸發器只被呼叫一次,即使 10 行用命令更新——然后Inserted將包含所有這 10 行更新。做這樣的選擇是危險的——你會得到任意一行,你會忽略所有其余的......
這就是你要找的嗎?
uj5u.com熱心網友回復:
我不清楚你在寫這段代碼時在想什么,或者你基于什么模板,但是有很多語法錯誤。
看起來你可能想要這樣的東西:
- 該
update()函式只告訴我們該列是否存在于update陳述句中,而不會告訴我們是否實際更改了任何內容。 - 我們需要檢查我們是否被遞回呼叫,以擺脫困境。
- 我們還檢查是否根本沒有更改任何行,并盡早退出
- 請注意如何比較
inserted和deleted以查看是否有任何行實際更改。這也可以正確處理多行。 - 然后我們需要重新加入
Products以更新它。
create or alter trigger CheckQuantity
on Products
after update
as
set nocount on;
if not(update(Products_QOH))
or trigger_nestlevel(object_id(N'dbo.CheckQuantity'),'AFTER','DML') > 1
or not exists (select 1 from inserted)
return; -- early bail-out
update p
set Product_ReOrder = 1
from Products p
join (
select i.YourPrimaryKey, i.Products_QOH
from inserted i
where i.Product_QOH < 5
except
select d.YourPrimaryKey, d.Products_QOH
from deleted d
) i on i.YourPrimaryKey = p.YourPrimaryKey;
但是,我根本不明白您為什么要使用觸發器。
我強烈建議您為此使用計算列:
ALTER TABLE Products
DROP COLUMN Product_ReOrder;
ALTER TABLE Products
ADD Product_ReOrder AS (CASE WHEN Product_QOH < 5 THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/369114.html
標籤:sql sql-server 触发器
下一篇:SQLServer中的遞回乘法
