2017-04-17 4 views
2

私は一時テーブルのため、このような命名規則を使用していないSQL Server:#ABCDEF01という名前のテーブルには何が含まれていますか?

など、要求

select * 
from tempdb.sys.objects 
where type_desc = 'USER_TABLE'  

を実行し、#AB12CD34のような名前の表を参照してください、#ABCDEF01。これらのテーブルの実際の名前を決定することは可能ですか?

+0

の可能性のある重複した[は、SQLサーバーに一時テーブルを作成するための#を使用することが必要ですか?](http://stackoverflow.com/questions/16749045/is-it-necessary-to-use-for- create-temp-tables-in-sql-server) – Igor

+0

@Igor複製ではありません。あなたがオリジナルとして提案した質問は、テンポラリテーブルに名前を付ける方法です。私の考えは、存在するテーブルの名前を復元する方法です。 – Oxoron

+0

私はこれらの言及テーブルが私の一時的なデータベースを発見していない。私はこれらが一時テーブルであることに同意し、セッション/接続が閉じられると自動的に削除されます。 –

答えて

1

これは、標準の一時テーブルのシステム命名規則ではありません。

一時表は、一般的に最後の六角は異なるセッション間の衝突を防ぐように作用する形式

#YourTempTableName______________ ... _________00000000000D 

で128文字の名前として表示されます。 #AB12CD34という名前

の表は、どちらかのテーブル変数/テーブル値パラメータであるか、またはストアド・プロシージャからの一時テーブルをキャッシュされます。それは次回の使用に再び再作成する必要はありませんので、

ストアドプロシージャが一時テーブルの実行を終了キャッシュすることができます。 FCheckAndCleanupCachedTempTableトランザクションは、テンポラリテーブルの名前をas part of this processの形式に変更します。

More about temporary table caching in this blog post

キャッシュされた一時テーブルは、キャッシュされた実行計画の実行コンテキストに属します。あなたはまた、

select * 
from sys.dm_os_memory_cache_entries 
where name='tempdb' AND entry_data LIKE '<entry database_id=''2'' entity_type=''object'' entity_id=''-%' 

でキャッシュされた一時テーブルを参照することができ

SELECT DB_NAME(dbid)    AS DatabaseName, 
     OBJECT_NAME(objectid, dbid) AS ObjectName 
FROM sys.dm_exec_cached_plans cp 
     CROSS apply sys.dm_exec_sql_text(cp.plan_handle) t 
     JOIN sys.dm_os_memory_objects m1 
     ON m1.memory_object_address = cp.memory_object_address 
     JOIN sys.dm_os_memory_objects m2 
     ON m1.page_allocator_address = m2.page_allocator_address 
WHERE m2.type = 'MEMOBJ_EXECUTE' 
     AND cp.objtype = 'Proc' 

でキャッシュされた実行コンテキストでストアドプロシージャを見ることができますしかし、私は一緒に計画は何をキャッシュするかを確認するためにこれらのリンクのいずれかの方法が表示されません一時オブジェクト。

あなたは、列名を見て、あなたがprocsのの1からテーブル構造を認識した場合に見ることができました。

WITH T 
    AS (SELECT * 
     FROM tempdb.sys.objects 
     WHERE type_desc = 'USER_TABLE' 
       AND name = '#' + CONVERT(VARCHAR, CAST(object_id AS BINARY(4)), 2)) 
SELECT T.name, 
     c.name, 
     type_name(c.user_type_id) AS Type 
FROM T 
     JOIN tempdb.sys.columns c 
     ON c.object_id = T.object_id; 
+0

Martin、最後のスクリプトは間違いなく私が必要とするものです。単一の不明なアイテムが残っています:これらのキャッシュされたオブジェクトは、テーブル構造のみ、または構造とデータを保持しますか?これらのキャッシュ上にたくさんのディスクスペースを確保したり、セキュリティ上の問題が発生する可能性はありますか? – Oxoron

+1

テーブル構造と1つの8K IAMページと8Kデータページに関するメタデータを保持するだけで、競合が発生してもこれらを再度割り振り解除する必要がなくなります。したがって、tempdb領域に関して重要なものを追加することはまずありません。特にセキュリティ上の問題はありません。 1つのセッションは別の以前のセッションの内容を見ることができません。 –

3

「#」で始まる任意のテーブルは、セッションまたは接続が失われるまで存在する一時的なテーブルです。テーブルは、現在のセッション内でのみ表示されます。 '##'で始まる表は、本質的にグローバルであり、他のセッション/接続がそれを見ることができるという点を除いて、同様のタイプの表です。

+0

ランディ、これらのテーブルの一部は3日前に作成されます。どのセッション\接続を作成したかを定義することは可能ですか? Principal_idがnullです。 – Oxoron

+0

質問に表示される命名規則は、標準の一時表のシステム表で使用される命名規則ではありません。これは、表変数またはストアド・プロシージャーのキャッシュされた一時表のいずれかです。 –

関連する問題