リモートのリンク サーバーに対してかなり複雑なクエリを実行しています。一時テーブルに情報を保存し、それに対して結合を実行できると便利です。すべてリモート データを使用します。一時テーブルをローカルに作成し、ワイヤを介してそれらに結合すると、非常に遅くなります。
リモートサーバーに一時テーブルを強制的に作成することはできますか? 自分自身の実際の (永続的な) テーブルを作成するための十分な権限を持っていないと仮定します。
リモートのリンク サーバーに対してかなり複雑なクエリを実行しています。一時テーブルに情報を保存し、それに対して結合を実行できると便利です。すべてリモート データを使用します。一時テーブルをローカルに作成し、ワイヤを介してそれらに結合すると、非常に遅くなります。
リモートサーバーに一時テーブルを強制的に作成することはできますか? 自分自身の実際の (永続的な) テーブルを作成するための十分な権限を持っていないと仮定します。
これは、私の環境で 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
私はパーティーに2年遅れていますがsp_executeSQL
、動的クエリを使用してフィードし、テーブルをリモートで作成することでこれを達成できます。
Exec RemoteServer.RemoteDatabase.RemoteSchema.SP_ExecuteSQL N'Create Table here'
これにより、リモートの場所で一時テーブルの作成が実行されます。
はい、できますが、接続中のみ持続します。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)
これは実用よりも学問的です!
リンクされたリモート サーバーに一時テーブルを直接作成することはできません。実際、リンク サーバーに対して DDL を使用することはできません。
リンク サーバーの使用に関するガイドラインと制限の詳細については、次を参照してください。
1つの回避策(そして私の頭の上から、これはリモートサーバーへのアクセス許可がある場合にのみ機能します):
理想的ではありませんが、可能な回避策です。
メモリがそれほど問題にならない場合は、一時テーブルの代わりにテーブル変数を使用することもできます。これは、リンクサーバーに対して一時的なデータストレージを必要とするストアドプロシージャを実行するときに機能しました。
詳細情報: たとえば、テーブル変数を使用することの欠点を含む、テーブル変数と一時テーブルのこの比較。