Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Obtenir des noms définitifs pour les colonnes de la variable de table

Vous pouvez interroger votre variable de table top(0) avec une outer apply à partir d'une ligne en utilisant for xml path('') puis interrogez le XML pour les noms d'éléments.

Cela fonctionnera tant que vos noms de colonne n'ont pas de noms qui sont des noms d'éléments XML non valides. Les noms de colonne ne peuvent par exemple pas utiliser d'esperluette ou d'espace.

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)

Une autre option serait d'utiliser le xmlschema directive de for xml auto . Cette solution gère les caractères XML non valides, mais ils sont échappés, donc si vous avez un nom de colonne avec un espace comme [provider Name] le résultat sera provider_x0020_Name .
Vous devez stocker le XML résultant dans une variable et interroger celle-ci pour obtenir les informations souhaitées.

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

Le XML créé par xmlschema contient plus d'informations qui pourraient être d'intérêt. Vous pouvez également récupérer le nom de la variable de table et les types de données.

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