Một phiên bản mà không có động lực liên quan. Nếu bạn có tên cột không hợp lệ để sử dụng làm tên phần tử trong XML, điều này sẽ không thành công.
select T2.N.value('local-name(.)', 'nvarchar(128)') as [Key],
T2.N.value('text()[1]', 'nvarchar(max)') as Value
from (select *
from TableA
for xml path(''), type) as T1(X)
cross apply T1.X.nodes('/*') as T2(N)
Một mẫu làm việc:
declare @T table
(
Column1 varchar(10),
Column2 varchar(10),
Column3 varchar(10)
)
insert into @T values('V1','V2','V3')
select T2.N.value('local-name(.)', 'nvarchar(128)') as [Key],
T2.N.value('text()[1]', 'nvarchar(max)') as Value
from (select *
from @T
for xml path(''), type) as T1(X)
cross apply T1.X.nodes('/*') as T2(N)
Kết quả:
Key Value
-------------------- -----
Column1 V1
Column2 V2
Column3 V3
Cập nhật
Đối với truy vấn có nhiều bảng, bạn có thể sử dụng for xml auto
để lấy tên bảng trong XML. Lưu ý, nếu bạn sử dụng bí danh cho tên bảng trong truy vấn, bạn sẽ nhận được bí danh thay thế.
select X2.N.value('local-name(..)', 'nvarchar(128)') as TableName,
X2.N.value('local-name(.)', 'nvarchar(128)') as [Key],
X2.N.value('text()[1]', 'nvarchar(max)') as Value
from (
-- Your query starts here
select T1.T1ID,
T1.T1Col,
T2.T2ID,
T2.T2Col
from T1
inner join T2
on T1.T1ID = T2.T1ID
-- Your query ends here
for xml auto, elements, type
) as X1(X)
cross apply X1.X.nodes('//*[text()]') as X2(N)