Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 一台服务器上出现几何错误,但另一台服务器上没有相同的数据_Sql Server_Tsql_Sqlgeometry - Fatal编程技术网

Sql server 一台服务器上出现几何错误,但另一台服务器上没有相同的数据

Sql server 一台服务器上出现几何错误,但另一台服务器上没有相同的数据,sql-server,tsql,sqlgeometry,Sql Server,Tsql,Sqlgeometry,我有一个包含大约400行地理数据的表,我正在使用STWithin方法来确定其中一行的边界内是否存在一个点 在我的测试服务器上,它工作正常。但是,对于最新版本的数据集,在live server上对其中一行数据的查询失败。如果我从查询中排除该行,那么它将成功 错误是: Msg 6522,16级,状态1,第3行 在执行用户定义的过程中发生.NET Framework错误 常规或聚合“几何体”:System.ArgumentException:24144: 无法完成此操作,因为实例无效。 使用MakeV

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

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

错误是:

Msg 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)


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

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

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

(将
yourTable
g
分别替换为实际表和列的名称)通过将坏数据更新为一次性操作,您不会产生在选择时间调用
MakeValid()
的开销(因为可能读比写更频繁)。您还可以为任何后续的数据加载实现上述内容。

您能提供“坏”实例的WKT吗?另外,代码的味道是您正在使用几何体数据类型(而不是地理)来存储地理数据。SharpGIS使用名为shape2sql.exe的工具从Shapefile(.shp)导入数据,这就是数据采用当前格式的原因。我还没有找到将.shp数据导入SQL Server的其他方法。我可以理解为什么它不是一个有效的地理实例(地理假设坐标是纬度/经度,而这些不是)。但对于您的实际问题,当我将其加载到本地实例时,我有一个奇怪的行为。如果我声明@g geometry=geometry::stgeomefromtext(«你的WKT»,0);选择@g一切正常。但如果我试图调用
@g
(比如
STNumGeometries()
)上的方法,它会抱怨。对它调用
MakeValid()
,一切正常。我怀疑你有内环定位问题。也就是说,第一个多边形中定义了“孔”……我认为其中一个孔的定义方向错误(例如,如果“父”多边形定义为逆时针方向,则为顺时针方向)。这很奇怪。我也不明白为什么它在一台服务器上工作,而不是在另一台服务器上工作?无论如何,将
MakeValid()
添加到我的查询中确实允许它运行:
SELECT*FROM polygonda,其中@Point.STWithin(GeoField.MakeValid())=1
感谢您的帮助。