Puoi interrogare la variabile della tua tabella top(0)
con un outer apply
da una riga usando for xml path('')
e quindi interroga l'XML per i nomi degli elementi.
Funzionerà fintanto che i nomi delle colonne non hanno nomi che sono nomi di elementi XML non validi. I nomi delle colonne, ad esempio, non possono utilizzare e commerciale o spazio.
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)
Un'altra opzione sarebbe quella di utilizzare xmlschema
direttiva di for xml auto
. Questa soluzione gestisce i caratteri XML non validi ma vengono sottoposti a escape, quindi se hai un nome di colonna con uno spazio come [provider Name]
il risultato sarà provider_x0020_Name
.
È necessario archiviare l'XML risultante in una variabile e interrogarla per ottenere le informazioni desiderate.
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);
L'XML creato da xmlschema
contiene ulteriori informazioni che potrebbero essere di interesse. Puoi anche recuperare il nome della variabile della tabella e i tipi di dati.
<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>