0

SQL Server 2008の空間型のWell-Known Text(WKT)への変換で、マシン間で一貫性のない動作が発生しています。データが同じに格納されているかのように見えます。しかし、WKTへの変換は、マシンによって異なる動作をします。ここでSQL空間型のWKT変換でのマシン間での矛盾

が、私は問題を特定するために一緒に入れて何か:

POINT(-124.95714099999999 39.326679)
:私が利用可能な様々なマシンでは

SET NOCOUNT ON; 

DECLARE @TestTable TABLE (TestPoint GEOGRAPHY); 
INSERT INTO @TestTable(TestPoint) VALUES (geography::STGeomFromText('POINT(-124.957140999999993 39.326679)',4326)); 

DECLARE @PointAsText NVARCHAR(max); 
SELECT @PointAsText = TestPoint.STAsText() from @TestTable; 
PRINT @PointAsText; 

DECLARE @PointAsBinary BINARY(22); 
SELECT @PointAsBinary = CAST(TestPoint AS BINARY(22)) from @TestTable; 
print @PointAsBinary; 

print @@version; 

、私は2つの異なる結果を参照してください0xE6100000010C1EA5129ED0A94340492A53CC413D5FC0
Microsoft SQL Server 2008 R2(SP1) - 10.50.2500.0 (X64)
        2011年6月17日0時54分03秒
       のWindows NT 6.1上の著作権(c)マイクロソフトコーポレーション
       デベロッパー版(64ビット)(7601をビルドします。サービスパック1)

又は

POINT(-124.957141 39.326679)
0xE6100000010C1EA5129ED0A94340492A53CC413D5FC0
のMicrosoft SQL Server 2008 R2(RTM) - 10.50.1600.1 (インテルX86)
        2010年4月2日午後03時53分02秒
       著作権(c)Microsoft Corporation
        Devel Windows NT 6.0上のOPER版(ビルド6002:サービスパック2)(ハイパーバイザ)は

別のテストケース2008 R2(RTM)とX64マシンは-124.95714099999999を与えることを示しています。したがって、確かにx86対x64を示します。

私は浮動小数点精度が不足していることに少なくとも少し慣れていますが、アーキテクチャー固有のことは認識していませんでした。 SQL空間ストレージで作業する場合、データがこれらのようなWKT変換を通過するように見えます。このデータを扱うより適切な戦略が見当たらないのですか?

答えて

0

数週間は活動がありませんので、私が知っているところで回答します。

よく知っておきたいのは、よく知られているテキスト(WKT)の使用を避けるだけです。私はオプションとしてWell-Known-Binary(WKB)についてはわかりません。

データベースでSqlGeographyを使用するときに精度と精度が損なわれないように、ミドルウェアまたはアプリケーションでSqlGeographyクラスを使用できます。この点で、クラスはバイナリシリアル化可能です。

Well-Known-Text(WKT)を使用してSqlGeographyクラスの安全性を維持すると、精度が低下し始めます。これは、ユーザーに表示する場合、または非.NETプラットフォーム(Webサービスの使用など)との通信を強制的に行う場合にのみ行うことをお勧めします。

0

私はその前にその動作を見たことがありません...同じバージョン/ OSを実行しているときに変換が完全に確定的であることが予想されます。 SQL Server 2008 R2(x64 10.50.2500)とSQL Azure(11.0.1831)の両方で、期待通りの最初の結果POINT(-124.95714099999999 39.326679)が得られることを確認できます。

は、私はあなたにも、これらのマシンから同じ結果を得ることを確認するように依頼することができたとき:

SELECT @PointAsText。

いうより:

PRINT @PointAsText。

私はストローでちょっと抱きついていることを認めますが、私はそれが間違いなく@PointAsTextの値が丸められていて、PRINTが適用できるいくつかの面白い書式ではないことを分かっています...

+0

ああ、豆!申し訳ありませんが、私はSQLサーバーからの出力にコピー貼り付けをしてしまいました。システムの1つはx86で、もう1つはx64です。マシンに再びアクセスできるときに、正しい@@バージョンのBLOBを取得します。 –

+0

さて、コピー+貼り間違いを修正するための質問を更新しました。また、SELECT対PRINTのクイックチェックを行いましたが、違いはありません。 –

関連する問題