Oracleサーバーからデータをインポートするために使用したいSQL Server 2008インスタンスがあります。
SELECT * FROM table
のような単純なクエリを実行するときに正しく機能するリンクサーバーを設定しました。ただし、変数を宣言するか、テーブル内の行またはOPENQUERY
内の他の行をループすると、エラーが発生します。
OPENQUERY
を使用してこれを行うことは可能ですか?追加の権限が必要ですか?
おそらく次のようなエラーが表示されます:
Msg 7357, Level 16, State 1, Line xx
Cannot process the object "<query text>".
The OLE DB provider "<provider>" for linked server "<server>" indicates that either
the object has no columns or the current user does not have permissions on that object.
これは、SQL ServerがOPENQUERY
ステートメントによって返されたデータの形状を検出しようとしたときに発生します。ここには多くの魅力的な詳細がありますが、結局のところ、OPENQUERY
は、すべての Books Onlineの例 と同じように、単一のSELECT
ステートメントだけで使用するのが最も良いことが多いです。
リモートストアドプロシージャの実行など、OPENQUERY
を使用して他のことを実行できますが、プロシージャは単一の結果セットのみを返す必要があり、その前にSELECT
を実行して、 SQL Serverが結果セットの形状をチェックする方法。
代わりにEXECUTE ... AT
を使用することもできます。次に例を示します。
DECLARE @Script nvarchar(max) =
N'
<some amazing script>
';
EXECUTE (@Script) AT <linked_server_name>
完全な構文とオプションについては Books Online を参照してください。
リンクサーバーのサーバーオプションプロパティEnable promotion of distributed transactions for RPC
をfalse
に設定して、結果をテーブルにキャプチャする必要があります。
INSERT <table> (columns)
EXECUTE (@Script) AT <linked server>;
EXECUTE
の結果はINSERT
に供給される前にtempdbにスプールされるため、これは効率が大幅に低下する可能性があることに注意してください。結果が大きい場合、これは問題になる可能性があります。
質問には遅れましたが、それでも、私は2ペニーの価値があると思いました。
手順「SET NOCOUNT ON」の最初の行を作成します。これにより、影響を受けるすべての行から返される複数の結果セットが抑制されます。 (わたしにはできる!)
OPENQUERYに続く最初の行にコメントがある場合も、同様のエラーが発生します。
つまり.
Select * From
OPENQUERY ( [db], '
#EFT history of all clients
Select
a.ClientNumber,
a.Description,
Sum(a.units) Drafts,
Sum(a.amount) DraftAmount
From trans a
Group by a.ClientNumber,
a.Description
') a
選択後または最後にコメントを移動するとエラーが解決します