Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Holen Sie sich endgültige Namen für Spalten aus der Tabellenvariablen

Sie können Ihre Tabellenvariable top(0) abfragen mit einer outer apply aus einer Zeile mit for xml path('') und dann das XML nach den Elementnamen abfragen.

Dies funktioniert, solange Ihre Spaltennamen keine Namen haben, die ungültige XML-Elementnamen sind. Die Spaltennamen dürfen beispielsweise kein kaufmännisches Und oder Leerzeichen enthalten.

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)

Eine andere Möglichkeit wäre die Verwendung des xmlschema Direktive von for xml auto . Diese Lösung verarbeitet ungültige XML-Zeichen, sie werden jedoch maskiert, wenn Sie einen Spaltennamen mit einem Leerzeichen wie [provider Name] haben das Ergebnis ist provider_x0020_Name .
Sie müssen das resultierende XML in einer Variablen speichern und diese nach den gewünschten Informationen abfragen.

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

Das von xmlschema erstellte XML enthält weitere Informationen, die von Interesse sein könnten. Sie können auch den Tabellenvariablennamen und die Datentypen abrufen.

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