我有一个表,其中包括一些邮政编码与他们的纬度和经度为实施例的数据库:不同的结果相比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
现在接受输入参数,并计算出正确的距离
感谢迅速的意见,存储过程是一个更大的存储过程的一部分,我一直试图剥离下来的基础知识,这不是返回部分正确的值,希望现在解决拼写错误 – samsinfield
我已经用所有原始代码更新了这个。一切都 – samsinfield
你知道SQL Server现在有一个'geography'数据类型,除了计算出的距离伟大的工作,对不对?你应该使用连接表'join',不'where' – podiluska