Sql 从表变量中获取列的最终名称

Sql 从表变量中获取列的最终名称,sql,sql-server,sql-server-2008,table-variable,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.sysobj

我可以声明如下表变量:

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)
我看到了上面为table变量声明的列

我的问题是,有没有办法将这些列与我在@tv_source上面的表声明中声明的名称最终关联起来


在普通表中,您会看到实际名称,但如上所述,表变量会变形为十六进制值,顺便说一句,十六进制值是对象id的十六进制值。

您可以使用for xml path从一行外部应用查询表变量top0,然后查询xml中的元素名称

只要列名没有无效的XML元素名称,这就可以工作。例如,列名不能使用符号和或空格

声明@tv\u源表 c1 int, providerName varchar50, providerSMS varchar50 选择TN.N.value‘local-name’,‘sysname’作为ColumnName 从…起 选择电视* 从中选择1作为DN 外敷 选择top0* 来自@tv\u来源 作为电视 对于xml路径元素xsini,键入 as TX 交叉应用TX.X.nodes“*”作为TNN 另一种选择是使用xml auto的xmlschema指令。此解决方案确实处理无效的XML字符,但它们是转义的,因此,如果列名带有空格(如[provider name]),则结果将是provider_x0020_name。 您需要将生成的XML存储到一个变量中,并查询该变量以获取所需的信息

声明@XML; set@XML= 选择top0* 来自@tv\u来源 对于XMLAuto,xmlschema,键入 ; 使用xmlnamespaces'http://www.w3.org/2001/XMLSchema'作为xsd 选择T.X.value'@name','sysname' 从@XML.nodes'//xsd:attribute'作为TX; xmlschema创建的XML包含可能感兴趣的更多信息。您还可以检索表变量名和数据类型


我从你的评论中看到,这个练习是为了学习,所以你没有特定的用例或需求。也就是说,从表变量获取详细列元数据的另一种方法是使用sp_descripe_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;';

@Hamlet Hakobyan表变量始终在中创建tempdb@PinnyM我不认为动态sql会有帮助,但我希望看到来自数据库的信息,而不是来自动态sql本身的文本——请记住这里的表变量的范围。也就是说,我愿意查看任何解决方案:从名称@tv_source到tempdb中的元数据是没有办法的。如果table变量至少包含一行,则可以获取对象id。@MartinSmith-谢谢,这是一种有点有趣的方法;始终创建GUID列名:我可以理解有时需要在查询中查找元数据,因为它可能针对不熟悉的对象;但表变量仅适用于单个批次。您正在编写什么样的代码,在单个批处理中无法跟踪变量的声明?您的意思是回答此链接吗?