6

私は、多数のサーバーを実行し、ローカルサーバーを含む多数のデータをサーバーから選択することになっているスクリプトを作成しています。必要なデータを選択するために必要なSQLはかなり複雑なので、一種のアドホックビューを記述し、OPENQUERYステートメントを使用してデータを取得しているため、最終的には次のようなステートメントをループすることになります。

exec('INSERT INTO tabl SELECT * FROM OPENQUERY(@Server, @AdHocView)')

ただし、ローカルサーバーでOPENQUERYを使用することは嫌われていると聞きました。誰かが理由について詳しく説明できますか?

4

3 に答える 3

7
  • クエリは複数の結果セットを返す場合がありますが、OPENQUERY は最初の結果セットのみを返します。
  • OPENQUERY は、その引数に変数を受け入れません。
  • OPENQUERY を使用して、リンク サーバーで拡張ストアド プロシージャを実行することはできません。ただし、拡張ストアド プロシージャは、4 部構成の名前を使用してリンク サーバー上で実行できます。
  • ストアド プロシージャが同じスクリプト内で使用される場合sp_addlinkedserver、リモート サーバーで使用される資格情報はスクリプトにハードコードされ、コピーを持っている人なら誰でも見ることができます。

参照:

于 2010-03-03T20:46:16.830 に答える
2

ただのフォローアップ。

OpenQueryは、ストアド プロシージャからいくつかの行セットを比較または操作する必要がある場合に適しています。

たとえば、 SQL Server 2005からSQL Server 2008に移行するときに、2 つのサーバー (テスト サーバーとロールアウト サーバー) の結果を比較する必要がある場合は、次のクエリを実行できます。

select * into test_table from OpenQuery(testServer, 'exec testdb.dbo.test_sp');
select * into rollout_table from OpenQuery(rolloutServer, 'exec testdb.dbo.test_sp');

select * from test_table
except
select * from rollout_table;

select * from rollout_table
except
select * from test_table;

矛盾がないか確認します。

于 2013-06-11T14:54:10.700 に答える
2

@OMG Poniesが言ったことに加えて、それは単に不必要です. アドホック クエリと分散トランザクション セマンティクスを導入する必要がないのに導入する理由はありません。使用OPENQUERYすると、予測しにくい計画やサーバーが依存関係を正確に追跡できないことなど、動的 SQL のマイナス面をすべて引き受けることになります。

OPENQUERYまた、ローカル ユーザーがターゲット サーバーへのアクセス許可を持っている必要があります。これは、管理スクリプトでない限り、おそらく必要ではありません。1 つのデータベースのすべてのユーザーが、他のすべてのデータベースに対して同じアクセス許可を持つことは期待できません。

于 2010-03-03T20:49:38.883 に答える