2013-04-22 90 views
0

我創建像下面域錯誤,同時更新

ALTER FUNCTION fn_Calc 
(@Lat1 Float, 
@Lng1 Float, 
@Lat2 Float, 
@Lng2 Float) 
RETURNS Float 
AS 
BEGIN 

Declare @x  as Float 
Declare @y  as Float 
Declare @Distance as Float 

Select @x = (SIN(RADIANS(@Lat1)) * SIN(RADIANS(@Lat2)) + COS(RADIANS(@Lat1)) * COS(RADIANS(@Lat2)) * COS(ABS((RADIANS(@Lng2)) - (RADIANS(@Lng1))))) 
Select @y = ATAN((SQRT(1-(POWER(@x,2)))/@x)) 

Select @Distance = (1.852 * 60.0 * ((@y/PI()) * 180))/1.609344 

RETURN @Distance 

END 

一個我使用上述功能,如下面更新表中的列函數的數據:

Update test 
set calc = dbo.fn_Calc(cast(Lat as float), cast(Long as float), dblLat, dblLong) 

運行上述查詢時,我得到了錯誤。

「發生域錯誤。」

什麼可能導致此錯誤?

+2

http://www.sql-server-performance.com/2007/domain-error-occurred/ – muhmud 2013-04-22 13:09:26

+0

請指定的參數值,你傳遞什麼到的功能。 – Devart 2013-04-22 13:18:34

回答

1

嘗試這一個 -

ALTER FUNCTION dbo.fn_Calc 
(
     @Lat1 FLOAT 
    , @Lng1 FLOAT 
    , @Lat2 FLOAT 
    , @Lng2 FLOAT 
) 
RETURNS FLOAT 
AS BEGIN 

    DECLARE 
      @x FLOAT 
     , @y FLOAT 

    SELECT @x = 
        SIN(RADIANS(@Lat1)) 
       * SIN(RADIANS(@Lat2)) + COS(RADIANS(@Lat1)) 
       * COS(RADIANS(@Lat2)) 
       * COS(ABS(RADIANS(@Lng2) - RADIANS(@Lng1))) 

    SELECT @y = ATAN(SQRT(ABS(1 - POWER(@x, 2)))/@x) 

    RETURN (111.12 * ((@y/PI()) * 180))/1.609344 

END 
+0

嗨Devart,我認爲它爲我工作。我需要做更多的測試來比較這些值。你能否讓我知道可能是導致錯誤的原因。我非常感謝你的幫助。萬分感謝。 – Roshan 2013-04-22 13:52:21

+0

@Roshan你的版本可能會嘗試在負數上執行平方根,SQL Server不能這麼做(嘗試'SELECT SQRT(-1)' - 你會得到一個不同的錯誤信息,但是ABS()會修復)。 – 2013-04-22 13:57:16

+0

@AaronBertrand「Devart」的上述更新對我來說工作正常。使用(111.12)而不是(1.852 * 60.0)的原因可能是兩者的值相同。 – Roshan 2013-04-22 14:09:33