我试图确定大型几何表中几何类型的分布,但即使在使用STIsValid()函数后仍然会出现无效的几何错误。
我使用的代码是:
WITH validDimensions AS
(
SELECT [id], [geometry]
FROM dimensions
WHERE [geometry].STIsValid()=1
)
SELECT COUNT(id), [geometry].STGeometryType() AS [GeometryType]
FROM validDimensions
GROUP BY
[geometry].STGeometryType()
如果我将第一个查询过滤到小于~200,000行的任何范围,则查询工作正常。
例如,
此查询有效:
WHERE [geometry].STIsValid()=1 AND id <200000
并且此查询有效:
WHERE [geometry].STIsValid()=1 AND id > 150000 AND id <300000
但此查询失败:
WHERE [geometry].STIsValid()=1 AND id <250000
错误是:
Msg 6522,Level 16,State 1,Line 1发生了.NET Framework错误 在执行用户定义的例程或聚合&#34; geometry&#34;时 System.ArgumentException:24144:无法完成此操作 因为实例无效。使用MakeValid转换 实例到有效实例。请注意,MakeValid可能会导致积分 几何实例稍微移位System.ArgumentException: 在Microsoft.SqlServer.Types.SqlGeometry.ThrowIfInvalid() 在Microsoft.SqlServer.Types.SqlGeometry.STGeometryType()
我可以通过使用.MakeValid()来运行查询,但它太慢而无法使用。有人遇到过这个吗?
编辑: 我通过切换到临时表而不是使用&#39; WITH&#39;来实现这一点:
SELECT [id], [geometry]
INTO validdimensions
FROM dimensions
WHERE [geometry].STIsValid()=1
SELECT COUNT(id), [geometry].STGeometryType() AS [GeometryType]
FROM validDimensions
GROUP BY
[geometry].STGeometryType()
我仍然有兴趣知道为什么第一个查询会出错。
谢谢,
最高