gpt4 book ai didi

sql - 从表变量中获取列的明确名称

转载 作者:行者123 更新时间:2023-12-02 23:38:43 25 4
gpt4 key购买 nike

我可以这样声明一个表变量:

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 的十六进制值)。

最佳答案

您可以使用 for xml path('') 从一行中使用 outer apply 查询表变量 top(0) 以及然后查询 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)

另一种选择是使用 for xml autoxmlschema 指令。此解决方案确实处理无效的 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);

xmlschema 创建的 XML 包含更多可能感兴趣的信息。您还可以检索表变量名称和数据类型。

<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>

关于sql - 从表变量中获取列的明确名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14369359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com