sql >> Databasteknik >  >> RDS >> Sqlserver

Få definitiva namn för kolumner från tabellvariabel

Du kan fråga din tabellvariabel top(0) med en outer apply från en rad med for xml path('') och fråga sedan XML för elementnamnen.

Detta kommer att fungera så länge som dina kolumnnamn inte har namn som är ogiltiga XML-elementnamn. Kolumnnamnen kan till exempel inte använda et-tecken eller mellanslag.

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)

Ett annat alternativ skulle vara att använda xmlschema direktiv för for xml auto . Den här lösningen hanterar ogiltiga XML-tecken men de escapes så om du har ett kolumnnamn med ett mellanslag som [provider Name] resultatet blir provider_x0020_Name .
Du måste lagra den resulterande XML-filen i en variabel och fråga efter den information du vill ha.

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 skapad av xmlschema innehåller mer information som kan vara av intresse. Du kan också hämta tabellvariabelns namn och datatyperna.

<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. Oracle uttalande

  2. Lagrad procedur gör att kommandon inte är synkroniserade vid nästa fråga

  3. SQL Server:Bifoga felaktig version 661

  4. MediumBlob i Laravels databasschema