Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 求解在检查纬度和经度的触发器上指定的非布尔类型的表达式_Sql_Sql Server_Tsql_Triggers - Fatal编程技术网

Sql 求解在检查纬度和经度的触发器上指定的非布尔类型的表达式

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

我想创建一个检查纬度和经度的触发器,但我无法添加此触发器,因为我有错误

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 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