0

我知道这已经像死马一样被殴打了。但是,无论我如何切片、投射或转换它,我都有同样的问题。将数据类型 varchar 转换为数字时出错。

SELECT  property_id, property_case_number, property_address, property_city, 
property_state, property_zip, property_lon, property_lat 
FROM property 
WHERE (property_active = 1) 
AND 
(property_county = (SELECT property_county FROM property AS property_1 
WHERE (property_id = 9165))) 
AND 
(property_id <> 9165)
AND
property_lon IS NOT Null 
AND 
property_lat IS NOT Null 
AND 
dbo.LatLonRadiusDistance(
CONVERT(DECIMAL(15,12),(select property_lat from property where property_id = 9165)), 
CONVERT(DECIMAL(15,12),(select property_lon from property where property_id = 9165)), 
property_lat,property_lon) <= '5'

我在最后添加 dbo.LatLonRadiusDistance 后就遇到了这个问题。

dbo.LatLonRadiusDistance 以英里为单位比较纬度和经度距离。

FUNCTION [dbo].[LatLonRadiusDistance] 
(
@lat1Degrees decimal(15,12),
@lon1Degrees decimal(15,12),
@lat2Degrees decimal(15,12),
@lon2Degrees decimal(15,12)
)
RETURNS decimal(9,4)
AS
BEGIN

DECLARE @earthSphereRadiusKilometers as decimal(10,6)
DECLARE @kilometerConversionToMilesFactor as decimal(7,6)
SELECT @earthSphereRadiusKilometers = 6366.707019
SELECT @kilometerConversionToMilesFactor = .621371

-- convert degrees to radians
DECLARE @lat1Radians decimal(15,12)
DECLARE @lon1Radians decimal(15,12)
DECLARE @lat2Radians decimal(15,12)
DECLARE @lon2Radians decimal(15,12)
SELECT @lat1Radians = (@lat1Degrees / 180) * PI()
SELECT @lon1Radians = (@lon1Degrees / 180) * PI()
SELECT @lat2Radians = (@lat2Degrees / 180) * PI()
SELECT @lon2Radians = (@lon2Degrees / 180) * PI()

-- formula for distance from [lat1,lon1] to [lat2,lon2]
RETURN ROUND(2 * ASIN(SQRT(POWER(SIN((@lat1Radians - @lat2Radians) / 2) ,2)
    + COS(@lat1Radians) * COS(@lat2Radians) * POWER(SIN((@lon1Radians - @lon2Radians) / 2), 2)))
    * (@earthSphereRadiusKilometers * @kilometerConversionToMilesFactor), 4)

END

我确定这与

(select property_lat from property where property_id = 9165)

但无论我如何转换或转换它都不会改变事情。

如果我自己运行该函数,它不会给出错误。

有人有任何见解吗?

这是一个示例行

8462    023-125514  15886 W MOHAVE ST   GOODYEAR    AZ  85338-0000  -112.400297000000   33.429041000000

property_lat & property_lon 是 varchar(50)

4

2 回答 2

0

您很可能期望布尔短路来挽救评估 WHERE 子句的顺序。这是一个已知的谬误:在 SQL 中不保证布尔运算符短路。有关查询优化器可以跳过布尔短路的讨论和证明,请参阅关于 SQL Server 布尔运算符短路。类似的主题是T-SQL 函数并不意味着一定的执行顺序。它的要点是 SQL 是一种声明性语言,而不是命令性语言。

在您的情况下,您的 cast 和 converts 可能会针对 ID不同的属性调用,property_id = 9165并且property_active=1可能会尝试将不是数字的字符串值转换为数字,因此您会看到异常。很难给出准确的诊断,因为您的问题描述中缺少太多信息(例如所有涉及的对象的确切定义,包括所有表、索引、列类型等)。

您最好的途径是升级到 SQL Server 2008 并使用内置的地理类型,该类型具有内置支持STDistance

这是测地线距离的近似值。普通地球模型上的 STDistance() 与精确测地线距离的偏差不超过 0.25%。

于 2012-06-05T08:04:04.713 回答
0

在玩完查询后,我得到了它的工作。

SELECT  [property_id], [property_case_number], [property_address], [property_city], 
[property_state], [property_zip], [property_lon], 
[property_lat] 
FROM property 
WHERE ([property_active] = 1) 
AND 
([property_county] = (SELECT b.property_county FROM property b WHERE (b.property_id =     @prop_id))) 
AND 
([property_id] <> @prop_id)
AND
[property_lon] IS NOT Null 
AND 
[property_lat] IS NOT Null 

AND
dbo.LatLonRadiusDistance(
(SELECT c.property_lat FROM property c WHERE (c.property_id = @prop_id)),
(SELECT d.property_lon FROM property d WHERE (d.property_id = @prop_id)),
CAST([property_lat] as FLOAT), 
CAST([property_lon] as FLOAT)) <= 5

添加 [] 似乎避开了我遇到的问题。

于 2012-06-05T13:52:33.923 回答