Sql server 更新数据时,SQL Server 2000中出现域错误

Sql server 更新数据时,SQL Server 2000中出现域错误,sql-server,sql-server-2000,Sql Server,Sql Server 2000,我创建了一个类似下面的函数 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(

我创建了一个类似下面的函数

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) 
在运行上述查询时,我得到了错误

“发生域错误。”

是什么导致了这个错误?

试试这个-

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

请指定参数值,以及传递给函数的内容。嗨,Devart,我想这对我有用。我需要做更多的测试来比较这些值。你能告诉我出错的原因吗。我真的很感谢你的帮助。非常感谢。@Roshan您的版本可能会尝试对负数执行平方根运算,而SQL Server无法做到这一点(请尝试
SELECT SQRT(-1)
-您会收到不同的错误消息,但
ABS()
将解决此问题)。@AaronBertrand上面由“Devart”进行的更新对我来说效果很好。使用(111.12)而不是(1.852*60.0)的原因可能是什么?两者的值都是相同的。你必须问@DevArt,尽管我不相信这是修复此问题的更改,他只是从其他地方获取此函数,而不是“修复”你的函数。顺便说一句,你在哪里买的?您是否注意到链接指出某些操作可能会因输入负数而导致错误而失败?您是否注意到答案中更重要的变化是它添加了一个防止负数的
ABS()
。虽然,实际上,平方根可以取负数,但T-SQL不能取负数(看看复数)。常量111.12的写入方式不会影响代码。这样写只是我的习惯。我很高兴能帮上忙。