Du kan fråga din tabellvariabel top(0)
med en outer apply
från en rad med for xml path('')
och fråga sedan XML för elementnamnen.
Detta kommer att fungera så länge som dina kolumnnamn inte har namn som är ogiltiga XML-elementnamn. Kolumnnamnen kan till exempel inte använda et-tecken eller mellanslag.
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)
Ett annat alternativ skulle vara att använda xmlschema
direktiv för for xml auto
. Den här lösningen hanterar ogiltiga XML-tecken men de escapes så om du har ett kolumnnamn med ett mellanslag som [provider Name]
resultatet blir provider_x0020_Name
.
Du måste lagra den resulterande XML-filen i en variabel och fråga efter den information du vill ha.
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 skapad av xmlschema
innehåller mer information som kan vara av intresse. Du kan också hämta tabellvariabelns namn och datatyperna.
<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>