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では保証されていません。ブール短絡がクエリオプティマイザによってスキップされる可能性があることの説明と証明については、SQLServerのブール演算子の短絡についてを参照してください。同様のトピックは、T-SQL関数が特定の実行順序を意味しないことです。その要点は、SQLは宣言型言語であり、命令型言語ではないということです。

あなたの場合、おそらくあなたのキャストと変換は、とは異なるIDを持つプロパティに対して呼び出され数値property_id = 9165property_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 に答える