1

私が行った場合:

select * from tempdb.sys.tables

システム内のすべての一時テーブルが表示されますが、そのビューには、各テーブルが属する接続/ユーザーに関する情報がありません。現在の接続で作成したテーブルのみを検索することに興味があります。これを行う方法はありますか?

ありがとう - e

psはい、成功したものは私のものであることが証明されるはずであるという考えでリストされた各テーブルを読み取ってみることができます(最近のバージョンでは、他の接続のテーブルを読み取ることはできません)が、数千のテーブルがある可能性があるため、コストがかかりすぎるアプローチですシステム上

私が読んだ pps SQL Server の現在のすべての一時テーブルのリストを取得する方法はありますか? これは正しい質問をしますが、良い答えが得られませんでした

4

3 に答える 3

3
select * 
from tempdb.sys.objects
where object_id('tempdb.dbo.' + name, 'U') is not null 
  AND name LIKE '#%'

アクセスできる#で始まるtempdbのすべてのテーブルを教えてくれますが、Aaronのスクリプトは私を水から吹き飛ばしました

于 2012-07-24T18:08:53.023 に答える
3

#temp テーブルに 3 つの連続するアンダースコアを使用しないと仮定すると、これは #temp テーブルのみを取得する必要があります。ただし、テーブル変数は取得されません。また、このコードを何らかの方法で変更して、他の誰かの接続でテーブルを選択することもできません。これOBJECT_ID('tempdb..#foo')は、セッション内のテーブルに対してのみ true を返すことができるためのみ機能します。

SELECT 
  name = SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1),
  t.[object_id]
FROM tempdb.sys.tables AS t
WHERE t.name LIKE '#%[_][_][_]%'
AND t.[object_id] = 
  OBJECT_ID('tempdb..' + SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1));

また、これらの各テーブル (少なくともヒープまたはクラスター化インデックス) によって使用される領域にも関心があるかもしれません。たとえば、次のようになります。

SELECT 
    name = SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1),
    t.[object_id], 
    p.used_page_count, 
    p.row_count
FROM tempdb.sys.tables AS t
INNER JOIN tempdb.sys.dm_db_partition_stats AS p
ON t.[object_id] = p.[object_id]
WHERE t.name LIKE '#%[_][_][_]%'
AND p.index_id IN (0,1)
AND t.[object_id] = 
    OBJECT_ID('tempdb..' + SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1));

これを拡張して、すべてのインデックスの合計スペースを表示できます。これらは #temp テーブルであるため、パーティションごとに集計する必要はありませんでした。

于 2012-07-24T18:04:01.007 に答える