sql >> Database teknologi >  >> RDS >> Sqlserver

Få endelige navne til kolonner fra tabelvariablen

Du kan forespørge på din tabelvariabel top(0) med en outer apply fra én række ved hjælp af for xml path('') og forespørg derefter XML for elementnavnene.

Dette vil fungere, så længe dine kolonnenavne ikke har navne, der er ugyldige XML-elementnavne. Kolonnenavnene kan f.eks. ikke bruge og-tegn eller mellemrum.

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)

En anden mulighed ville være at bruge xmlschema direktiv af for xml auto . Denne løsning håndterer ugyldige XML-tegn, men de er escaped, så hvis du har et kolonnenavn med et mellemrum såsom [provider Name] resultatet bliver provider_x0020_Name .
Du skal gemme den resulterende XML til en variabel og forespørge efter den information, du ønsker.

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 oprettet af xmlschema indeholder flere oplysninger, der kan være af interesse. Du kan også hente tabelvariabelnavnet og datatyperne.

<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. php:indlæsning af oracle-driver giver fejl Kan ikke indlæse dynamisk bibliotek - Den angivne procedure kunne ikke findes.

  2. MySQL Query eksekverer, men kaster undtagelse

  3. Oracle REGEXP_SUBSTR | Hent streng mellem to skilletegn

  4. SQL - Manglende højre parentes