1

我有一个包含大约 400 行地理数据的表,我正在使用该STWithin方法来确定一个点是否存在于其中一个行的边界内。

在我的测试服务器上它工作正常。但是,对于最新版本的数据集,查询在实时服务器上对这些数据行之一失败。如果我从查询中排除该行,那么它会成功。

错误是:

消息 6522,第 16 层,状态 1,第 3 行

执行用户定义的例程或聚合“几何”期间发生 .NET Framework 错误: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)。

我不明白为什么相同的数据会在一台服务器上成功而在另一台服务器上失败?非常感谢任何帮助,谢谢。

4

1 回答 1

2

原来表中有无效数据。添加此作为答案,但也添加了一种方法来修复表中的数据。

update t
set g = g.MakeValid()
from dbo.yourTable as t
where t.g.STIsValid() = 0;

(分别用实际表和列的名称替换yourTableg)通过将坏数据更新为一次性操作,您不会产生MakeValid()在选择时调用的开销(因为可能读取比写入更频繁)。您还可以为您执行的任何后续数据加载实施类似上述的方法。

于 2017-08-08T01:23:06.450 回答