Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Dapatkan nama definitif untuk kolom dari variabel tabel

Anda dapat mengkueri variabel tabel Anda top(0) dengan outer apply dari satu baris menggunakan for xml path('') lalu kueri XML untuk nama elemen.

Ini akan berfungsi selama nama kolom Anda tidak memiliki nama yang merupakan nama elemen XML yang tidak valid. Nama kolom misalnya tidak boleh menggunakan ampersand atau spasi.

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)

Pilihan lain adalah menggunakan xmlschema arahan for xml auto . Solusi ini menangani karakter XML yang tidak valid tetapi karakter tersebut diloloskan, jadi jika Anda memiliki nama kolom dengan spasi seperti [provider Name] hasilnya akan menjadi provider_x0020_Name .
Anda perlu menyimpan XML yang dihasilkan ke variabel dan menanyakannya untuk informasi yang Anda inginkan.

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 yang dibuat oleh xmlschema berisi lebih banyak informasi yang mungkin menarik. Anda juga dapat mengambil nama variabel tabel dan tipe datanya.

<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. SSIS - Konversi Beberapa Nilai Kolom Menjadi Null

  2. Bagaimana cara mendapatkan nilai kotak centang dari tampilan kisi saat kotak centang OnCheckedChanged

  3. Bagaimana cara menetapkan hasil exec ke variabel sql?

  4. Bisakah batasan Periksa berhubungan dengan tabel lain?

  5. Kinerja INNER JOIN vs LEFT JOIN di SQL Server