sql >> Databáze >  >> RDS >> Sqlserver

Získejte definitivní názvy sloupců z proměnné tabulky

Můžete se dotazovat na proměnnou tabulky top(0) s outer apply z jednoho řádku pomocí for xml path('') a pak dotaz na názvy prvků v XML.

To bude fungovat, pokud názvy sloupců nebudou mít názvy, které jsou neplatnými názvy prvků XML. Názvy sloupců například nemohou používat ampersand nebo mezeru.

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)

Další možností by bylo použít xmlschema direktiva for xml auto . Toto řešení zpracovává neplatné znaky XML, ale jsou uvozeny, takže pokud máte název sloupce s mezerou jako [provider Name] výsledkem bude provider_x0020_Name .
Výsledný XML musíte uložit do proměnné a dotazovat se na požadované informace.

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 vytvořený xmlschema obsahuje více informací, které by vás mohly zajímat. Můžete také získat název proměnné tabulky a datové typy.

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


  1. Vyberte klauzuli uvnitř funkce pl/sql vrátí nesprávnou hodnotu

  2. Lepší ALTER než DROP

  3. Dlouhá doba připojení k Azure Postgres

  4. Postgres:Jak převést řetězec json na text?