2013-08-16 69 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

相關問題