Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Вземете окончателни имена за колони от променливата на таблицата

Можете да поискате вашата променлива на таблицата top(0) с outer apply от един ред с помощта на for xml path('') и след това потърсете XML за имената на елементите.

Това ще работи, докато имената на вашите колони нямат имена, които са невалидни имена на XML елементи. Имената на колоните могат например да не използват амперсанд или интервал.

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)

Друг вариант е да използвате xmlschema директива на for xml auto . Това решение обработва невалидни XML знаци, но те са екранирани, така че ако имате име на колона с интервал като [provider Name] резултатът ще бъде provider_x0020_Name .
Трябва да съхраните получения XML в променлива и да поискате информацията, която искате.

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, създаден от xmlschema съдържа повече информация, която може да представлява интерес. Можете също така да извлечете името на променливата на таблицата и типовете данни.

<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. Обработка на грешки в SQL Server:изключения и договор база данни-клиент

  2. Използвайте NEWSEQUENTIALID(), за да създадете нарастващ GUID в SQL Server

  3. Неправилен синтаксис близо до „LIMIT“ при използване на mssql

  4. Как да актуализирам от SELECT в SQL Server?

  5. SQL Server 2016:Въздействие върху производителността на винаги криптирани