2010-09-01 106 views
0

我有下面的存儲過程代碼,當我執行它給出了一個錯誤,說無效列名Lat,Lng.These Lat和Lng變量是從後面用sql查詢最後在這個段落裏。在sql server中創建存儲過程和視圖的問題

CREATE FUNCTION spherical_distance(@a float, @b float, @c float) 
RETURNS float 
AS 
BEGIN 
    RETURN (6371 * ACOS(COS((@a/@b)) * COS( (Lat/@b) ) * COS((Lng/@b) - (@c/@b)) + SIN(@a/@b) * SIN( Lat/@b )))  
END 

create view [dbo].[business] as 
SELECT Id, 
     Name1, 
     ZipCode, 
     StreetName, 
     StreetNumber, 
     State1, 
     Lat, 
     Lng, 
     Keyword 
    FROM Business_Details 

sqlda.SelectCommand.CommandText = "select *, spherical_distance(Lat, 57.2958, Lng) as distance 
            from business 
            where ((distance < '" + radius + "') 
             and (StreetName like '%" + streetname + "%') 
             and (Keyword like '%" + keyword1 + "%')) 
           order by spherical_distance(Lat,57.2958,Lng)"; 
+0

您的查詢以Sql Injection爲準。 (當streetname變量的值爲'')); DELETE Business_Details; - 「,運行SelectCommand將清空數據庫中的表。) – treaschf 2010-09-01 05:43:45

+0

此問題已重複爲http://stackoverflow.com/q/ 3615364/217751 – treaschf 2010-09-01 06:35:48

回答

1

如何將@符號放在這些參數前面?

+0

感謝您的回覆,我試着把@放在前面的Lat和Lng,但它表示錯誤,說 消息137,級別15,狀態2,過程spherical_distance,第6行 必須聲明標量變量「@Lat」。 CREATE FUNCTION spherical_distance(@a float,@b float,@c float) RETURNS float AS BEGIN RETURN(6371 * ACOS(COS((@ a/@ b))* COS((@ Lat/@ b ))* COS((@ Lng/@ b) - (@ c/@ b))+ SIN(@ a/@ b)* SIN(@ Lat/@ b))) END – mahesh 2010-09-01 05:41:36

+0

你忘了寫那樣...'「+ lat +」'...'「+ lng +」'... – ppshein 2010-09-01 06:07:35

1

當您創建spherical_distance函數時,它不知道LatLng表達式的任何內容。應該是這兩個功能的附加參數,如@a,@b@c分別是? (該功能不知道該視圖的東西)

後來,當你調用函數,你傳遞從科拉姆Lat價值爲@a,並從Lng@c,所以在功能這兩個參數將包含值從這些欄目。