我可以声明表变量为这样:
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”表声明中声明的名字联系起来?
在一个正常的表,你会看到实际的名称,但是,正如上面提到的,表变量会马上蜕变成十六进制值(其中,顺便说一句是OBJECT_ID的十六进制值)。
您可以查询您的表变量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
的指令for xml auto
。 该解决方案确实处理无效的XML字符,但他们逃脱了,所以如果你有像一个空间列名[provider Name]
的结果将是provider_x0020_Name
。
您需要将生成的XML存储变量和查询,对您想要的信息。
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
包含可能感兴趣的信息。 您可以检索表变量名和数据类型为好。
<xsd:schema xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet12" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet12" elementFormDefault="qualified">
<xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
<xsd:element name="_x0040_tv_source">
<xsd:complexType>
<xsd:attribute name="c1" type="sqltypes:int" />
<xsd:attribute name="providerName">
<xsd:simpleType>
<xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1035" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth">
<xsd:maxLength value="50" />
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="providerSMS">
<xsd:simpleType>
<xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1035" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth">
<xsd:maxLength value="50" />
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:schema>
我从你的意见,这项工作是学习的看,所以你没有一个具体的使用情况或需要。 这就是说,另一路从表变量变量是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;';