Sql 求解在检查纬度和经度的触发器上指定的非布尔类型的表达式
我想创建一个检查纬度和经度的触发器,但我无法添加此触发器,因为我有错误 Msg 4145,15级,状态1,程序t点,第5行[批次起始行0] 在预期条件的上下文中指定的非布尔类型的表达式 我的扳机看起来像Sql 求解在检查纬度和经度的触发器上指定的非布尔类型的表达式,sql,sql-server,tsql,triggers,Sql,Sql Server,Tsql,Triggers,我想创建一个检查纬度和经度的触发器,但我无法添加此触发器,因为我有错误 Msg 4145,15级,状态1,程序t点,第5行[批次起始行0] 在预期条件的上下文中指定的非布尔类型的表达式 我的扳机看起来像 create trigger t_point_between on Vehicle after insert as begin declare @latitude as float declare @longitude as float if (select l
create trigger t_point_between
on Vehicle
after insert
as
begin
declare @latitude as float
declare @longitude as float
if (select latitude from Vehicle v where v.latitude)< 19.7922354 and latitude > 20.2173455
begin
print 'Incorrect latitude!!!'
print 'latitude must be between 19.7922354 and 20.2173455'
end
if (select longitude from Vehicle where longitude)< 49.9676667 and longitude > 50.1261338
begin
print 'Incorrect longitude!!!'
print 'longitude must be between 49.9676667 and 50.1261338'
end
end
go
插入后触发检查纬度和经度,当纬度不是从该点打印按摩时,必须从该点开始
我为什么会有这个问题?有人能解释一下原因吗?我想下面就是你想要的 您需要引用插入的伪表来测试当前插入。 您需要使用或而不是和来测试超出范围的值 您需要使用EXISTS来测试是否存在错误值。 您需要在子查询中提取整个条件 请注意,在普通客户端上下文中打印此错误不会有多大作用。您可能想抛出错误。根本不使用触发器,请使用检查约束: 更改表dbo.车辆 添加约束chk_车辆本地检查纬度>=19.7922354 纬度=49.9676667
为什么触发器根本没有插入引用?当不使用变量@latitude和@longitude时,它们是用来做什么的?而且,看起来您正试图从它们之外的子查询中引用列?那不行。至于错误,你有where v.latitude和where longitude子句。纬度的值是多少?这只是布尔表达式的一半,因此出现了错误。最后,为什么要将其作为触发器来执行,以及为什么所述触发器不通过抛出来停止事务?检查约束将比触发器优越得多。@konrad您熟悉接受答案吗?
create trigger t_point_between
on Vehicle
after insert
as
begin
set nocount on;
if exists (select 1 from Inserted v where v.latitude < 19.7922354 or v.latitude > 20.2173455)
begin
print 'Incorrect latitude!!!';
print 'latitude must be between 19.7922354 and 20.2173455';
end;
if exists (select 1 from Inserted v where v.longitude < 49.9676667 or v.longitude > 50.1261338)
begin
print 'Incorrect longitude!!!';
print 'longitude must be between 49.9676667 and 50.1261338';
end;
end;
go