web-dev-qa-db-ja.com

OPENQUERYを使用してスクリプトを実行する

Oracleサーバーからデータをインポートするために使用したいSQL Server 2008インスタンスがあります。

SELECT * FROM tableのような単純なクエリを実行するときに正しく機能するリンクサーバーを設定しました。ただし、変数を宣言するか、テーブル内の行またはOPENQUERY内の他の行をループすると、エラーが発生します。

OPENQUERYを使用してこれを行うことは可能ですか?追加の権限が必要ですか?

4
user802599

おそらく次のようなエラーが表示されます:

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 RPCfalseに設定して、結果をテーブルにキャプチャする必要があります。

INSERT <table> (columns)
EXECUTE (@Script) AT <linked server>;

EXECUTEの結果はINSERTに供給される前にtempdbにスプールされるため、これは効率が大幅に低下する可能性があることに注意してください。結果が大きい場合、これは問題になる可能性があります。

10
Paul White 9

質問には遅れましたが、それでも、私は2ペニーの価値があると思いました。

手順「SET NOCOUNT ON」の最初の行を作成します。これにより、影響を受けるすべての行から返される複数の結果セットが抑制されます。 (わたしにはできる!)

3
Gil Vicente

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

選択後または最後にコメントを移動するとエラーが解決します

1
Yesenia Garcia