可以使用确定#t1等临时表的名称
select @TableName = [Name] from tempdb.sys.tables where [Object_ID] = object_id('tempDB.dbo.#t1')
如何找到表值变量的名称,即声明的变量名称
declare @t2 as table (a int)
目的是能够使用类似的东西获取关于表的元信息
select @Headers = dbo.Concatenate('[' + c.[Name] + ']') from sys.all_columns c inner join sys.tables t on c.object_id = t.object_id where t.name = @TableName
虽然对于临时表,你必须查看tempdb.sys.tables
而不是sys.tables
.你在哪里寻找表值变量?
我现在意识到我不能做我想做的事情,这是写一个通用函数来将表值变量格式化为html表.对于初学者,在sql server 2005中,您无法传递表值参数:
http://www.sqlteam.com/article/sql-server-2008-table-valued-parameters
而且,在sql server 2008中,参数必须是强类型的,因此您将始终知道列的数量和类型.
表变量元数据也可以查看tempdb.sys.tables
.这可以从下面容易地验证
declare @t2 as table ( [38F055D8-25D9-4AA6-9571-F436FE] int) SELECT t.name, t.object_id FROM tempdb.sys.tables t JOIN tempdb.sys.columns c ON t.object_id = c.object_id WHERE c.name = '38F055D8-25D9-4AA6-9571-F436FE'
示例结果
name object_id ------------------------------ ----------- #4DB4832C 1303675692
但是您会注意到对象名称是自动生成的,与变量名称无关.
如果您没有可用于过滤的保证唯一列名称,并且表变量中至少有一行,您可以(从SQL Server 2008开始)使用%%physloc%%
并DBCC PAGE
确定此信息.以下示例.
DECLARE @t2 AS TABLE ( a INT) INSERT INTO @t2 VALUES (1) DECLARE @DynSQL NVARCHAR(100) SELECT TOP (1) @DynSQL = 'DBCC PAGE(2,' + CAST(file_id AS VARCHAR) + ',' + CAST( page_id AS VARCHAR) + ',1) WITH TABLERESULTS' FROM @t2 CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% ) DECLARE @DBCCPage TABLE ( [ParentObject] [VARCHAR](100) NULL, [Object] [VARCHAR](100) NULL, [Field] [VARCHAR](100) NULL, [VALUE] [VARCHAR](100) NULL ) INSERT INTO @DBCCPage EXEC (@DynSQL) SELECT VALUE AS object_id, OBJECT_NAME(VALUE, 2) AS object_name FROM @DBCCPage WHERE Field = 'Metadata: ObjectId'