Tsql SQL选择有效的几何图形而不使用MakeValid

Tsql SQL选择有效的几何图形而不使用MakeValid,tsql,sql-server-2008-r2,sqlgeometry,Tsql,Sql Server 2008 R2,Sqlgeometry,我有一个包含SQLGeometry值的大数据表。根据OGC(),许多行包含“格式不好”的几何体。这会导致我的许多几何图形在检查时抛出错误 当我使用此SQL查询时,我错误地认为它会忽略无效的几何图形: SELECT [Geometry] FROM Features WHERE [Geometry] IS NOT NULL AND [Geometry].STIsValid() = 1 AND [Geometry].STGeometryType() = 'Point' STGe

我有一个包含SQLGeometry值的大数据表。根据OGC(),许多行包含“格式不好”的几何体。这会导致我的许多几何图形在检查时抛出错误

当我使用此SQL查询时,我错误地认为它会忽略无效的几何图形:

SELECT [Geometry] FROM Features 
  WHERE [Geometry] IS NOT NULL
    AND [Geometry].STIsValid() = 1
    AND [Geometry].STGeometryType() = 'Point'
STGeometryType()
函数抛出以下错误:

在执行用户定义例程或聚合“几何体”时发生.NET Framework错误:System.ArgumentException:24144:由于实例无效,无法完成此操作。使用MakeValid将实例转换为有效实例。请注意,“MakeValid”可能会导致几何体实例的点发生轻微移动。System.ArgumentException:位于Microsoft.SqlServer.Types.SqlGeometry.ThrowIfInvalid()处的Microsoft.SqlServer.Types.SqlGeometry.STGeometryType()处

我使用子查询得到相同的错误:

SELECT G.* FROM (
  SELECT [Geometry] FROM Features 
    WHERE [Geometry] IS NOT NULL
     AND [Geometry].STIsValid() = 1
) AS G
   WHERE G.[Geometry].STGeometryType() = 'Point'
使用该函数不是一个可行的解决方案,我不能让SQL Server任意更改我的几何图形,但我需要能够知道它们对于这样的视图是什么类型:

CREATE VIEW vw_Points
AS
  SELECT [Geometry] FROM vwValidFeatures 
    WHERE [Geometry].STGeometryType() = 'Point'
有人有更好的解决方案或解决方法吗?


我能想到的最佳解决方案是选择所有几何体,然后解析字符串,因为
statext()
在无效时不会抛出任何错误。

这是我自己能找到的最佳解决方案:

CREATE VIEW [vwValidGeometries]
AS
  SELECT A.* FROM (
    SELECT 
        Id,
        CASE [Geometry].STIsValid() 
           WHEN 1 THEN [Geometry] 
           ELSE NULL 
        END AS 'Geo'
    FROM Features
  )
    WHERE Geo IS NOT NULL
然后:

这将隔离
STIsValid()
函数,使其不会被任何函数触及,从而在几何体无效时引发错误


我在上找到了此答案。

注意:在我发布此答案时,我还没有隔离哪些行抛出了错误,如果我这样做,我将发布一个示例。我在下面发布了一个答案,不确定这是否是可能的最佳解决方案,是否有其他人可以想出更好的解决方案,我将接受它。您是否查看了填充
功能表的过程,以查看是什么导致某些行具有无效的几何图形?@Mazhar,这是一个我无法更改的外部过程。。。我不会真的称它们为无效,根据SQLServer的实现,它们只是无效的。例如:
LINESTRING(12 12 0,12 12 5)
无效,这是一条垂直线,但SQL server认为它应该是一个
点(12 12 0)
。所以除了解决问题,我真的什么都做不了。
SELECT * FROM vwValidGeometries WHERE Geo.STGeometryType() = 'Point'