sql >> Database >  >> RDS >> Sqlserver

Krijg definitieve namen voor kolommen uit tabelvariabele

U kunt uw tabelvariabele top(0) . opvragen met een outer apply van één rij met for xml path('') en vraag vervolgens de XML naar de elementnamen.

Dit werkt zolang uw kolomnamen geen namen hebben die ongeldige XML-elementnamen zijn. De kolomnamen mogen bijvoorbeeld geen ampersand of spatie gebruiken.

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)

Een andere optie zou zijn om het xmlschema . te gebruiken richtlijn van for xml auto . Deze oplossing verwerkt ongeldige XML-tekens, maar ze zijn voorzien van escapetekens, dus als je een kolomnaam hebt met een spatie zoals [provider Name] het resultaat is provider_x0020_Name .
U moet de resulterende XML opslaan in een variabele en die opvragen voor de gewenste informatie.

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

De XML gemaakt door xmlschema bevat meer informatie die van belang kan zijn. U kunt ook de naam van de tabelvariabele en de datatypes ophalen.

<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. Hulp nodig om 8k kolomwaarde van R naar CLOB-kolom te duwen (Oracle)

  2. mysql-query join/inner join

  3. Hoe de tabelnaam van sqlite DB weer te geven -- Android

  4. Variabele in while-lus krijgen op basis van wat de gebruiker kiest?