从表变量中获取列的确定名称

时间:2013-01-16 22:50:17

标签: sql sql-server sql-server-2008 table-variable

我可以声明一个表变量:

DECLARE @tv_source TABLE(c1 int, 
providerName varchar(50),
providerSMS varchar(50))

如果我执行以下操作,我会看到表名类似于:"#468862B0"

select top 1 * from tempdb.sys.tables where type = 'U' order by create_date desc
select TOP 1 name,* from tempdb.sys.sysobjects ORDER BY CRDATE desc

如果我然后立即执行:

select TOP 3 * 
from tempdb.sys.columns 
where object_id in (select TOP 1 object_id from tempdb.sys.tables ORDER BY Create_date desc)

我看到上面为表变量声明的列。

我的问题是,有没有办法明确地将这些列与我在上面的表格声明中声明的名称相关联" @ tv_source"?

在普通表中,您会看到实际名称,但如上所述,表变量变为十六进制值(btw是object_id的十六进制值)。

2 个答案:

答案 0 :(得分:6)

您可以使用top(0)在一行中使用outer apply查询表变量for xml path(''),然后在XML中查询元素名称。

只要您的列名称的名称不是无效的XML元素名称,这将起作用。例如,列名称不能使用&符号或空格。

declare @tv_source table
(
  c1 int, 
  providerName varchar(50),
  providerSMS varchar(50)
)

select TN.N.value('local-name(.)', 'sysname') as ColumnName
from 
  (
  select TV.*
  from (select 1) as D(N)
    outer apply (
                select top(0) *
                from @tv_source
                ) as TV
  for xml path(''), elements xsinil, type
  ) as TX(X)
cross apply TX.X.nodes('*') as TN(N)

另一种选择是使用xmlschema的{​​{1}}指令。此解决方案确实处理了无效的XML字符,但它们会被转义,因此如果您的列名称为for xml auto,则结果为[provider Name]
您需要将生成的XML存储到变量中,并查询所需的信息。

provider_x0020_Name

declare @XML xml; set @XML = ( select top(0) * from @tv_source for xml auto, xmlschema, type ); with xmlnamespaces('http://www.w3.org/2001/XMLSchema' as xsd) select T.X.value('@name', 'sysname') from @XML.nodes('//xsd:attribute') as T(X); 创建的XML包含可能感兴趣的更多信息。您也可以检索表变量名和​​数据类型。

xmlschema

答案 1 :(得分:0)

我从您的评论中看到,此练习是为了学习,因此您没有具体的用例或需求。也就是说,从表变量变量获取详细列元数据的另一种方法是使用sp_describe_first_result_set。

EXEC sp_describe_first_result_set @tsql =  N'
declare @tableName table (ID bigint,
                            Column1 bigint,
                            Column2 datetime,
                            createdBy nvarchar(100),
                            dateAdded nvarchar(12),
                            Type nvarchar(10)
                            )
SELECT * FROM @tableName;';