0

有人可以确认这是一个错误还是我做错了?SQL Server地理中的错误?

我有这个存储过程(SQL Server 2008中)

ALTER PROCEDURE [dbo].[Distance] 
@origin varchar(50),@destination varchar(50),@unit varchar(5) 
as 
    declare @or geography, @dest geography 
    SET @or = (select Location from [dbo].Promotion where [email protected]) 
    SET @dest = (select Location from [dbo].Promotion where [email protected]) 
IF @unit='miles' 
SELECT @or.STDistance(@dest)/1609.344 
ELSE 
--Else show the distance in km 
SELECT @or.STDistance(@dest)/1000 

位置是在数据库

地理数据类型,而且我在数据库

 Latitude  Longitude 
1 -34.612654 -58.463586 
2 -34.592802 -58.454317 
3 -34.597889 -58.617949 

已经这个地址,然后运行这个:

execute dbo.Distance 'Number 1','Number 2','km' 
returns 2653.49845233371 kms 

execute dbo.Distance 'Number 1','Number 3','km' 
returns 17.2155414117145 kms 

如果您在第一种情况下访问Google地图,那么坐标距离这些坐标约为4公里,而第二个比较似乎没有问题。

为什么第一个是如此错误?这是SQL Server中的错误吗?

在此先感谢。吉列尔莫。

+1

使用大型应用程序的第一条规则是数百万人使用 - 该错误在您的代码中。第二条规则 - 该错误在您的代码中。第三条规则....你有这个想法;) – Jamiec

+0

我假设位置是一个计算列,基于纬度和经度列?如果是这样,你能给它的定义吗? (如果你可以创建一个简单的表,使用INSERT来填充你的样本数据,并且用一个简单的查询来产生结果,那么其他人就可以重现这个结果会容易得多) –

回答

0

好吧,我已经找到了问题是什么,是的,当然这是我的错:)

我插入表中的记录是这样

INSERT INTO [dbo].[TestLocation]([Name],[Location],[Latitude],[Longitude]) VALUES('Location1', geography::STGeomFromText('POINT(-34.612654 -58.463586)', 4326),-34.612654,-58.463586); 

然后我意识到首先,经度和纬度都是倒置的,所以我已经按顺序改变了,但只是最后两个字段而忘了改变“geography :: STGeomFromText”中的顺序。运行后

SELECT 
    Ubicacion.Lat, 
    Ubicacion.Long 
FROM 
    Promotion 

我意识到错误是什么。卫生署!

注意这一点作为

SELECT 
    Ubicacion.Lat, 
    Ubicacion.Long 
FROM 
    Promotion 

要知道这是作为地理数据类型保存为二进制文件,所以它不是人类可读的,所以,除非你运行上面的查询,你会不知道的源问题。

谢谢!吉列尔莫。

+1

这是一个很好的理由将'Location'的定义从'Location geography not null'改为'Location AS geography :: Point(Latitude,Longitude,4326)'。或换句话说,不要*存储*计算值。 (可选地,添加'持久化非空',它甚至应该允许它被索引) –

+0

我会检查。谢谢! – polonskyg