我有一個表,其中包括一些郵政編碼與他們的緯度和經度爲實施例的數據庫:不同的結果相比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