Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Nhận tên xác định cho các cột từ biến bảng

Bạn có thể truy vấn biến bảng của mình top(0) với một outer apply từ một hàng bằng cách sử dụng for xml path('') và sau đó truy vấn XML để tìm tên phần tử.

Điều này sẽ hoạt động miễn là tên cột của bạn không có tên là tên phần tử XML không hợp lệ. Ví dụ, tên cột có thể không sử dụng ký hiệu và hoặc dấu cách.

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)

Một tùy chọn khác là sử dụng xmlschema chỉ thị của for xml auto . Giải pháp này xử lý các ký tự XML không hợp lệ nhưng chúng được thoát ra, vì vậy nếu bạn có tên cột với khoảng trắng như [provider Name] kết quả sẽ là provider_x0020_Name .
Bạn cần lưu trữ XML kết quả vào một biến và truy vấn để tìm thông tin bạn muốn.

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 được tạo bởi xmlschema chứa nhiều thông tin có thể được quan tâm. Bạn cũng có thể truy xuất tên biến bảng và các kiểu dữ liệu.

<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. Trạng thái HTTP 500 - Môi trường thời gian chạy Java (JRE) phiên bản 1.7 không được trình điều khiển này hỗ trợ

  2. Cách khắc phục:“SQLServerAgent hiện không chạy…”

  3. trên máy chủ ms-sql, công cụ tốt nhất để lấy tất cả các phụ thuộc giữa tất cả các đối tượng là gì?

  4. Cách giải mã chuỗi unicode base64 bằng T-SQL

  5. đặt hàng bởi newid () - nó hoạt động như thế nào?