2013-08-16 46 views
4

我有一个表,其中包括一些邮政编码与他们的纬度和经度为实施例的数据库:不同的结果相比EXEC

Id PostCode Latitude   Longitude 
1 ll29 8ht 53.2973289489746 -3.72970223426819 

该表是由MVC代码生成-first应用, 纬度和经度数据类型为实

我已存储的过程作为输入searchLatitude和searchLongitude然后计算距离:

CREATE PROCEDURE [dbo].[StockistSearch] 
    @searchLat float = 0, 
    @searchLng float = 0 
AS 
BEGIN 
    SET NOCOUNT ON; 
SELECT top 40 
s.Id as Id, 
a.Company as Company, 
a.FirstName as FirstName, 
a.LastName as LastName, 
a.Address1 as Address1, 
a.Address2 as Address2, 
a.City as City, 
a.ZipPostalCode as ZipPostalCode, 
a.PhoneNumber as PhoneNumber, 
a.FaxNumber as FaxNumber, 
a.Email as Email, 
s.latitude as Latitude, 
s.longitude as Longitude, 
(3959 * acos(cos(radians(@searchLat)) 
* cos(radians(s.latitude)) 
* cos(radians(s.longitude) 
- radians(@searchLng)) 
+ sin(radians(@searchLat)) 
* sin(radians(s.latitude)))) 
AS Distance 
FROM Stockist s, Customer c, Address a 
where s.CustomerId = c.Id 
and c.ShippingAddress_Id = a.Id  
ORDER BY distance 
END 

如果我通过SQL Server Management Studio中执行此,它执行以下操作:

DECLARE @return_value int 

EXEC @return_value = [dbo].[StockistSearch] 
    @searchLat = 53.29, 
    @searchLng = -3.72 

SELECT 'Return Value' = @return_value 

GO 

它会返回正确的距离(0.645英里)

然而,当通过应用程序执行的使用:

var result = this.Database.SqlQuery<TEntity>(commandText, parameters).ToList(); 

其中根据一个跟踪,执行:

exec sp_executesql N'StockistSearch',N'@searchLat float,@searchLng float',@searchLat=53.29,@searchLng=-3.72 

这会导致完全不同的(和错误的)结果计算出的距离,(它返回距离3688.96英里!)

我已经通过在调试代码加强和参数被正确输入并确认执行sp_executesql给出了一个不同的结果,直接运行在SQL服务器管理工​​作室时EXEC

我完全不知道为什么会发生这种情况,尽管存储过程似乎正常工作,但通过应用程序显示的结果是完全错误的。

请可有人请给我一些意见,我发疯之前!

感谢

UPDATE

感谢到目前为止所有的意见,并感谢@McKay,我已经收窄,将其从EXEC sp_executesql的调用时忽略了输入参数,并使用默认值0经纬度。如果我删除默认值,我得到的错误:

Procedure or function 'StockistSearch' expects parameter '@searchLat', which was not supplied. 

的SQL查询

exec sp_executesql N'StockistSearch', N'@searchLat real, @searchLng real',@searchLat=53.29,@searchLng=-3.72 

这个SQL是实体框架自动生成(代码优先MVC EF目前不支持存储程序,但应该能够使用查询存储过程中的DbContext :)下面

var result = this.Database.SqlQuery<TEntity>(commandText, parameters).ToList(); 

将不胜感激任何进一步的帮助

FIXED :-)

致电时:

var result = this.Database.SqlQuery<TEntity>(commandText, parameters).ToList(); 

命令文本必须具有的参数附加到其上,以便

commandText = "StockistSearch @searchLat,@searchLng" 

因此所得到的SQL是;

exec sp_executesql N'StockistSearch @searchLat,@searchLng', N'@searchLat real, @searchLng real',@searchLat=53.29,@searchLng=-3.72 

现在接受输入参数,并计算出正确的距离

+0

感谢迅速的意见,存储过程是一个更大的存储过程的一部分,我一直试图剥离下来的基础知识,这不是返回部分正确的值,希望现在解决拼写错误 – samsinfield

+0

我已经用所有原始代码更新了这个。一切都 – samsinfield

+0

你知道SQL Server现在有一个'geography'数据类型,除了计算出的距离伟大的工作,对不对?你应该使用连接表'join',不'where' – podiluska

回答

1

这个不同的数字让我觉得它可能是使用默认值的东西?你有没有拿出默认值?

也许你也可以添加参数到选择,以确保你得到你所期望的。

SELECT top 40 
    @searchLatitude, 
    @searchLongitude, 
    l.Id as Id, 
    l.Postcode as Postcode, 
    l.latitude as Latitude, 
    l.longitude as Longitude, 

这可能有助于您的调试过程。

+0

嗨麦凯,你的权利使用默认值,我手动执行使用0和0作为经度和纬度,它给了我3688英里的结果。 – samsinfield

+0

但是,如果我删除默认值,应用程序现在给我的错误:过程或函数'StockistSearch'期望参数'@searchLat',这是没有提供。 – samsinfield

+0

@samsinfield我很高兴你的工作。 – McKay

0

你们有两个存储过程,一个叫DistanceSearch和一个叫StockistSearch?它看起来像你的代码。你确定正在调用正确的程序吗?

+0

是的,它看起来很不一样。参数名称也不匹配。 – McKay

+0

嗨,对不起,它的另一个错字。它是一个更大的存储过程的一部分,我已经将其中的一部分用于测试,并粘贴了它不工作的部分 – samsinfield

+0

@samsinfield我们可能需要查看其余部分。必须有一个错误分配的地方:( – Meff

0

错误在您的过程中。

(3959 * acos(cos(radians(@searchLatitude)) 
* cos(radians(l.latitude)) 
* cos(radians(l.longitude) 
- radians(@searchLongitude)) 
+ sin(radians(@searchLat)) 
* sin(radians(l.latitude)))) 

一个使用@searchLat,一个使用@searchLatitude

等待中,PROC似乎选择表,并没有返回值,但你的执行预期的输出参数?

+0

感谢您的快速回答,这只是从我复制代码时的错字:-(实际存储过程中它实际上是正确的 – samsinfield

+0

@samsinfie ld你应该更新这个例子来确保事情是一致的。所以我们真的可以帮忙吗? – McKay

+0

感谢@McKay,现在更新了代码,让我知道如果我错过了其他任何内容 – samsinfield

0

区别在于它的调用方式。

您的SSMS调用返回返回值。您的sp_executesql调用返回数据集。我猜40最近的配货是3688.96英里远

+0

感谢您的评论,但那里没有第40个零售商,只是数据库中的一个字段进行测试。由于某些原因,exec sp_executesql没有接受输入参数,并且正在使用3688英里外的默认值(0和0) – samsinfield

相关问题