【问题标题】:SQL Server; STDistance function not working in update statementsSQL 服务器; STDistance 函数在更新语句中不起作用
【发布时间】:2015-12-25 16:24:24
【问题描述】:

我有一张这样的桌子

EventTable(IsFar bit,位置geography

Select 语句没有问题: 我可以简单地运行它而没有错误:

DECLARE @center AS  GEOGRAPHY = GEOGRAPHY::Point(50, -160, 4326);        
SELECT * FROM EventTable WHERE  @center.STDistance(Location) > 100000

不使用更新语句:但是当我想根据它与某个点的距离更新IsFar 列时,它会抛出异常

'>' 附近的语法不正确。

代码如下:

DECLARE @center AS  GEOGRAPHY = GEOGRAPHY::Point(50, -160, 4326);        
UPDATE EventTable SET IsFar = @center.STDistance(Location) > 100000

谁能解释为什么这不起作用?

【问题讨论】:

    标签: sql sql-server spatial sqlgeography


    【解决方案1】:

    你需要添加Where子句

    UPDATE EventTable SET IsFar = @center.STDistance(Location) 
    where @center.STDistance(Location) > 100000
    

    根据您的评论

    UPDATE eventtable 
    SET    isfar = CASE 
                     WHEN @center.STDistance(location) > 100000 THEN 1 
                     ELSE 0 
                   END 
    

    如果您使用的是Sql Server 2012+,那么您可以使用IIF

    UPDATE eventtable 
    SET    isfar = IIF(@center.STDistance(location) > 100000, 1, 0)
    

    根据您的要求替换case 语句中的01

    【讨论】:

    • 好主意,但 IsFar 的类型是 bit 而不是 float
    • 是的,它解决了问题,但我没想到会有这么多代码,我很惊讶为什么 SQL 不支持这种语法
    • 只是它不是一个有效的语法。无论从功能上还是技术上,您的查询都有错误。您正在尝试将@center.STDistance(Location) 分配给BIT 列并检查条件并更新您需要使用CASEIIF 语句
    • 但我试图将@center.STDistance(Location) > 100000 分配给位
    • SQL 中,您需要case 语句来验证条件并根据结果返回01
    猜你喜欢
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多