8

リモートのリンク サーバーに対してかなり複雑なクエリを実行しています。一時テーブルに情報を保存し、それに対して結合を実行できると便利です。すべてリモート データを使用します。一時テーブルをローカルに作成し、ワイヤを介してそれらに結合すると、非常に遅くなります。

リモートサーバーに一時テーブルを強制的に作成することはできますか? 自分自身の実際の (永続的な) テーブルを作成するための十分な権限を持っていないと仮定します。

4

5 に答える 5

5

これは、私の環境で SQL 2005 SP3 にリンクされた SQL 2005 SP3 から機能します。ただし、tempdb を調べると、テーブルが実際にはローカル インスタンス上にあり、リモート インスタンス上にないことがわかります。私はこれを他のフォーラムでの解決策として見てきました。

create table SecondServer.#doll
(
  name varchar(128)
)
GO
insert SecondServer.#Doll
select name from sys.objects where type = 'u'


select * from SecondServer.#Doll
于 2010-02-05T19:30:32.913 に答える
3

私はパーティーに2年遅れていますがsp_executeSQL、動的クエリを使用してフィードし、テーブルをリモートで作成することでこれを達成できます。

Exec RemoteServer.RemoteDatabase.RemoteSchema.SP_ExecuteSQL N'Create Table here'

これにより、リモートの場所で一時テーブルの作成が実行されます。

于 2012-04-03T14:13:48.203 に答える
2

はい、できますが、接続中のみ持続します。EXECUTE AT 構文を使用する必要があります。

EXECUTE('SELECT * INTO ##example FROM sys.objects; WAITFOR DELAY ''00:01:00''') AT [SERVER2]

SERVER2 では、次のように動作します (1 分間)。

SELECT * FROM ##example

ただし、ローカル サーバーでは機能しません。ちなみに、##example を使用する 2 番目のサーバーでトランザクションを開くと、オブジェクトはトランザクションが閉じられるまで残ります。また、最初のサーバーでのステートメントの作成が完了しなくなります。つまり、server2 で実行すると、server1 でのトランザクションは無期限に続行されます。

BEGIN TRAN
SELECT * FROM ##example WITH (TABLOCKX)

これは実用よりも学問的です!

于 2011-11-18T10:11:50.417 に答える
2

リンクされたリモート サーバーに一時テーブルを直接作成することはできません。実際、リンク サーバーに対して DDL を使用することはできません。

リンク サーバーの使用に関するガイドラインと制限の詳細については、次を参照してください。

分散クエリを使用するためのガイドライン (SQL 2008 オンライン ブック)

1つの回避策(そして私の頭の上から、これはリモートサーバーへのアクセス許可がある場合にのみ機能します):

  • リモート サーバー上に、IN パラメータに基づく名前を持つ永続テーブルを作成するストアド プロシージャがある
  • リモートストアドプロシージャはクエリを実行し、結果をこのテーブルに挿入します
  • 次に、そのテーブルに対してローカルでクエリを実行し、必要なローカル テーブルへの結合を実行します。
  • 完了したら、リモート サーバーで別のストアド プロシージャを呼び出して、リモート テーブルを削除します。

理想的ではありませんが、可能な回避策です。

于 2010-02-05T20:14:32.997 に答える
1

メモリがそれほど問題にならない場合は、一時テーブルの代わりにテーブル変数を使用することもできます。これは、リンクサーバーに対して一時的なデータストレージを必要とするストアドプロシージャを実行するときに機能しました。

詳細情報: たとえば、テーブル変数を使用することの欠点を含む、テーブル変数と一時テーブルのこの比較。

于 2011-05-03T11:18:07.597 に答える