我有一张包含大约400行地理数据的表格,我正在使用STWithin
方法确定某个点是否存在于其中一行的边界内。
在我的测试服务器上,它工作正常。但是,对于最新版本的数据集,查询在其中一行数据上的实时服务器上失败。如果我从查询中排除该行,那么它就会成功。
错误是:
Msg 6522,Level 16,State 1,Line 3
执行用户定义时发生.NET Framework错误 例程或聚合“geometry”:System.ArgumentException:24144: 无法完成此操作,因为该实例无效。 使用MakeValid将实例转换为有效的实例。请注意,MakeValid可能会导致几何实例的点稍微移动。
查询的简化版本是:
DECLARE @Point GEOMETRY = GEOMETRY::Point(416420, 345058, 0)
SELECT *
FROM PolygonData
WHERE @Point.STWithin(GeoField) = 1
测试服务器是SQL Server 2012(11.0.2100.60),实时服务器是SQL Server 2012(11.0.6544.0)。
我看不出为什么相同的数据会在一台服务器上成功而在另一台服务器上失败?非常感谢任何帮助,谢谢。
答案 0 :(得分:2)
事实证明表中存在无效数据。添加此作为答案,但也添加了一种方法来修复表中的数据。
update t
set g = g.MakeValid()
from dbo.yourTable as t
where t.g.STIsValid() = 0;
(分别用实际表和列的名称替换yourTable
和g
)通过将错误数据更新为一次性操作,您不会产生调用的开销在选择的时间MakeValid()
(可能是读取比写入更频繁)。您还可以为您执行的任何后续数据加载实现类似上述内容。