我创建了以下触发器,以便如果Sales.OrderDetails表中的任何项目的unitprice小于10,则其折扣不能超过.5:
create trigger Sales.tr_SalesOrderDetailsDML
on Sales.OrderDetails
After insert, update
as
begin
if @@ROWCOUNT > 0 return ;
set nocount on;
if exists (select oi.orderid
from inserted as oi
where oi.unitprice < 10.0 and oi.discount > 0.50)
Throw 50002, 'Order can''t have discount more than 5 if unit price is less than 10', 10;
end;
go
当我插入以下行时:
INSERT INTO Sales.OrderDetails (orderid,productid,unitprice,qty,discount)
VALUES (10249, 16, 9.00, 1, 0.90);
它接受它,触发器不会抛出错误,尽管它的unitprice小于10且decount大于5。
我在这里缺少什么?
答案 0 :(得分:3)
这里有多个错误。
after
触发器。意味着它只会在插入或更新行后执行。if @@ROWCOUNT > 0 return;
更改您的表格以添加一个检查约束,当单价低于10时,该约束将阻止折扣价值大于5。
ALTER TABLE Sales.OrderDetails
ADD CONSTRAINT CHK_UnitPriceAndDiscount
CHECK (unitprice > 10 OR discount < 0.5)
GO
答案 1 :(得分:1)
检查此行if @@ROWCOUNT > 0 return ;
如果受影响的行大于0,则会立即返回...因此不会执行其他逻辑。替换为if @@ROWCOUNT = 0
答案 2 :(得分:1)
删除if (@@rowcount=0) return;
,将其更改为
format_output
答案 3 :(得分:1)
@@rowcount
下没有声明,因为[ { Latitude: '3.59288601404616',
Longitude: '98.6827551573515',
Latitude1: '3.5828173285855724',
Longitude1: '98.69136337190866',
},
{ Latitude: '3.65865664490563',
Longitude: '98.6652326211333',
Latitude1: '3.5828173285855724',
Longitude1: '98.69136337190866',
} ]
大于0然后返回