web-dev-qa-db-ja.com

SQL Serverの現在のすべての一時テーブルのリストを取得する方法はありますか?

一時テーブルはセッション/接続にバインドされており、セッション/接続からは表示またはアクセスできません。

さまざまな段階で一時テーブルを作成する、長時間実行されるストアドプロシージャがあります。

現在の一時テーブルのリストを表示する方法はありますか?そのためにはどのような特権が必要ですか?

あるいは、

実行中のストアドプロシージャ内で実行されている特定のSQLステートメントを確認する方法はありますか?この手順は、SQL Serverでスケジュールされたジョブとして実行されています。

SQL Server 2000を使用しています。

ご指導ありがとうございます。

59
AAsk

これはあなたが望んでいることですか?

select * from tempdb..sysobjects
--for sql-server 2000 and later versions

select * from tempdb.sys.objects
--for sql-server 2005 and later versions
93
Sandro

次のクエリで一時テーブルのリストを取得できます。

select left(name, charindex('_',name)-1) 
from tempdb..sysobjects
where charindex('_',name) > 0 and
xtype = 'u' and not object_id('tempdb..'+name) is null
8
SELECT left(NAME, charindex('_', NAME) - 1)
FROM tempdb..sysobjects
WHERE NAME LIKE '#%'
    AND NAME NOT LIKE '##%'
    AND upper(xtype) = 'U'
    AND NOT object_id('tempdb..' + NAME) IS NULL

グローバル一時テーブルを含める場合は、##行を削除できます。

2
FLICKER

SQL Server 2000の場合、これはセッション内の#tempテーブルのみを示します。 ( より新しいバージョンのSQL Serverの私の例 から適応。)これは、CREATE TABLE #foo___bar

SELECT 
  name = SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1),
  t.id
FROM tempdb..sysobjects AS t
WHERE t.name LIKE '#%[_][_][_]%'
AND t.id = 
  OBJECT_ID('tempdb..' + SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1));
2
Aaron Bertrand

一時テーブルのリストを「見る」必要がある場合は、使用されている名前をログに記録するだけです。 (他の人が指摘したように、この情報を直接照会することは可能です)

一時テーブルの内容を「見る」必要がある場合は、(一意の)一時的な名前で実際のテーブルを作成する必要があります。

SQL Profilerを使用して、実行中のSQLをトレースできます。

[これらの記事は2000年以降のSQL Serverバージョンを対象としていますが、多くのアドバイスは同じです。]

ビジネスにとって重要な長いプロセスがある場合は、プロセスのさまざまなステップ(ステップ名/番号、開始および終了時間)を記録することをお勧めします。そうすることで、物事がうまくいかないときと比較するためのベースラインが得られ、どのステップが問題を引き起こしているかをより迅速に特定できます。

2
Mitch Wheat