1

如果我做:

select * from tempdb.sys.tables

我将看到系统中的所有临时表,但是该视图没有关于每个表属于哪个连接/用户的信息。我有兴趣只查找在当前连接上创建的表。有没有办法做到这一点?

谢谢-e

ps是的,我可以尝试阅读列出的每个表,并认为那些成功的表应该是我的(在最近的版本中,无法读取其他连接的表),但这种方法成本太高,因为可能有数千个表在系统上

pps 我确实读过有没有办法获取 SQL Server 中所有当前临时表的列表?它提出了正确的问题但没有得到好的答案

4

3 回答 3

3

假设你没有用三个连续的下划线命名你的#temp 表,这应该只选择你的#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 回答
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 回答
0

要找出创建对象的用户的名称,您只需检查模式 ID 并与 Schemas 表交叉引用

Select sch.name as 'User Owner' from tempdb.sys.tables TBL
join tempdb.sys.schemas SCH on TBL.schema_id = SCH.schema_id
where TBL.name like '#tmp_Foo%'
于 2017-01-12T17:09:52.900 回答