如果我这样做:
select * from tempdb.sys.tables
我将在系统中看到所有临时表,但该视图没有关于每个表所属的连接/用户的信息。我只想查找我在当前连接上创建的表格。有没有办法做到这一点?
谢谢 - e
P.S。是的,我可以尝试阅读列出的每个表格,认为成功的那些应该证明是我的(在最近的版本中,一个人无法读取其他连接的表格),但这种方法成本太高,因为可能有数千个表格系统
p.p.s。我确实读过Is there a way to get a list of all current temporary tables in SQL Server?,它提出了正确的问题,但没有得到一个好的答案
答案 0 :(得分:3)
假设您没有为具有三个连续下划线的#temp表命名,那么应该只选择#temp表。但是,它不会获取您的表变量,也不能以某种方式更改此代码以在其他人的连接上选择表 - 这只能起作用,因为OBJECT_ID('tempdb..#foo')
只能为会话中的表返回true。 / p>
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 tables。
答案 1 :(得分:3)
select *
from tempdb.sys.objects
where object_id('tempdb.dbo.' + name, 'U') is not null
AND name LIKE '#%'
告诉你tempdb中所有以#开头的表,你可以访问,但是Aaron的剧本只是把我从水中吹走了哈哈
答案 2 :(得分: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%'