为什么 Sql 地理 "Valid" 在 SQL Server 2014 上和 "Invalid" 在 Azure SQL 上?

Why is this Sql Geography "Valid" on SQL Server 2014 and "Invalid" on Azure SQL?

这是查询。抱歉,它在粘贴箱 link 而不是在这个问题中,但是地理数据超过了问题的最大字符数!

http://pastebin.com/i0t1sqQR

那里有两个版本的查询。

第一个是普通查询,它在 2014 年运行良好,但在 Azure Sql 我得到:

Msg 6522, Level 16, State 1, Line 11
A .NET Framework error occurred during execution of user-defined routine or aggregate "geography": 
System.ArgumentException: 24200: The specified input does not represent a valid geography instance. Use MakeValid to convert the instance to a valid instance. Note that MakeValid may cause the points of a spatial instance to shift slightly.
System.ArgumentException: 
   at Microsoft.SqlServer.Types.SqlGeography..ctor(GeoData g, Int32 srid)
   at Microsoft.SqlServer.Types.SqlGeography.GeographyFromBinary(OpenGisType type, SqlBytes wkbGeography, Int32 srid)

第二个版本添加了.MakeValid()。它在 2014 年再次运行良好,但我在 Azure Sql.

上再次遇到完全相同的错误

为什么这会有所不同?

为什么 MakeValid() 不起作用?


作为旁注...Sql Server 和 Azure Sql 之间差异的文档在哪里?

我找到了 2014 年的博客 post:http://blogs.msdn.com/b/rbrundritt/archive/2014/08/18/working-with-invalid-geography-objects-in-sql-azure.aspx

引用了 2011 年的补丁说明:http://social.technet.microsoft.com/wiki/contents/articles/6197.updated-spatial-features-in-the-sql-azure-q4-2011-service-release.aspx

所以 MakeValid 在文章的 table 中显示为有效,但有一个注释说 "actually this doesn't work at all" 并且这是 3 年来该问题的唯一迹象?

简短的回答是第一个地理位置在任何一种情况下都无效(即在本地 SQL 或 Azure)。如果我从你的 pastebin link 中取出代码并将其稍微转换为:

exec sp_executesql N'
DECLARE @Location geography = geography::STGeomFromWKB(@wkb, 4326);
SELECT  @Location.STIsValid()
',N'@wkb varbinary(max)',@wkb=0x0106...

我返回 0(即 false)。也就是说,我不知道为什么 SQL 的本地版本能够显示第一个地理实例;通常,前提是它是有效的。

如果这是一次性操作,也许使用看似限制较少的预置版本来生成有效的地理区域,然后您可以将其导出到 Azure 将对您有用。