web-dev-qa-db-ja.com

SQLServerの空間サーバーとリンクサーバー

リンクサーバーを別のSQLインスタンスに追加したSQLServerインスタンスがあります。リンクサーバーでアクセスしているテーブルには、空間タイプが含まれています。テーブルをクエリしようとすると、エラーが発生します。

CLRタイプの列を公開するオブジェクトは、分散クエリでは許可されていません。パススルークエリを使用して、リモートオブジェクトにアクセスしてください。

同じクエリでOPENQUERYを使用すると、別のエラーが発生します。

現在のコマンドで重大なエラーが発生しました。結果がある場合は、破棄する必要があります。

リンクサーバーを介して空間タイプを含むテーブルをクエリする方法はありますか?

21
BryceH

これを回避する1つの方法は、空間データをNVARCHAR(MAX)として渡すことです。

select go=geometry::STGeomFromText(go,0)
from openquery([other\instance],
'select go=convert(nvarchar(max),go) from tempdb.dbo.geom')

注:goは列名であり、geometry-objectの略です。

または、明示的なキャストの代わりに関数を使用する

select go=geometry::STGeomFromText(go,0)
from openquery([other\instance],
'select go=go.STAsText() from tempdb.dbo.geom')
17
RichardTheKiwi

私は同じ問題に遭遇しましたが、まったく異なるクエリを期待するように変更できなかった多くのアプリケーションのため、私の場合、受け入れられた解決策はオプションではありませんでした。

代わりに、私はシステムをだます方法を見つけたと思います。ローカルサーバーで実行:

CREATE VIEW stage_table
AS
SELECT *
FROM OPENQUERY([REMOTESERVER],'SELECT * FROM [REMOTEDB].[SCHEMA].TARGET_TABLE');
GO
CREATE SYNONYM TARGET_TABLE FOR stage_table;
GO

出来上がり、あなたは今簡単に使うことができます

SELECT * FROM TARGET_TABLE;

これはおそらくあなたのアプリケーションが期待するものです。

ローカルサーバー:SQLEXPRESS 2008 R2、およびリモートサーバーSQL EXPRESS2014で上記のシナリオを試しました。

14
pkExec

別の回避策があります。 OPは空間データを選択しようとしていたため、OPの質問には適用されません。空間データを含む列を選択していない場合でも、このエラーが発生します。したがって、そのようなテーブルをクエリする必要があり、空間データを取得する必要がない場合は、テーブルのビューを作成し(空間データ列を除く、必要な列のみを選択)、代わりにそのビューに対してクエリを実行できます。 。

5
Anssssss