Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Uzyskaj ostateczne nazwy kolumn ze zmiennej tabeli

Możesz zapytać o zmienną tabeli top(0) z outer apply z jednego wiersza za pomocą for xml path('') a następnie zapytaj XML o nazwy elementów.

Będzie to działać, o ile nazwy kolumn nie mają nazw, które są nieprawidłowymi nazwami elementów XML. Nazwy kolumn mogą na przykład nie zawierać znaku handlowego ani spacji.

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)

Inną opcją byłoby użycie xmlschema dyrektywa for xml auto . To rozwiązanie obsługuje nieprawidłowe znaki XML, ale są one zmieniane, więc jeśli masz nazwę kolumny ze spacją, taką jak [provider Name] wynikiem będzie provider_x0020_Name .
Należy zapisać wynikowy kod XML w zmiennej i wykonać zapytanie w celu uzyskania żądanych informacji.

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 utworzony przez xmlschema zawiera więcej informacji, które mogą być interesujące. Możesz również pobrać nazwę zmiennej tabeli i typy danych.

<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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak usunąć ograniczenia klucza obcego w bazie danych SQL Server dla wszystkich tabel — samouczek SQL Server / TSQL, część 72

  2. Przesyłanie strumieniowe obrazów z baz danych za pomocą HttpHandler

  3. Jak wyświetlić listę wszystkich tabel we wszystkich bazach danych w programie SQL Server w jednym zestawie wyników?

  4. Jak znaleźć numer tygodnia daty według DATEFIRST

  5. 2 sposoby na zwrócenie listy wyzwalaczy w bazie danych SQL Server przy użyciu T-SQL