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>