ms sql 查询多个表列作为相同的标签(续集)

Geo*_*uke 3 xml sql-server

扩展这个原始问题

我正在使用 SQL Server Express 2017

假装这是我的源表:

+-------------+---------------------------+
| ID | Name   | Age  | HairColor | HasCar |
+-------------+---------------------------+
| 1  | Bert   | 25   | blonde    | 1      |
| 2  | Agnes  | 61   | white     | 0      |
| 3  | Diane  | 43   | brunette  | 1      |
+-------------+---------------------------+
Run Code Online (Sandbox Code Playgroud)

如何得到这样的结果?

<MyRootElement>
    <MyGroupingTag Group="1">
      <MyTag Value="1"      />
      <MyTag Value="Bert"   />    
      <MyTag Value="25"     />
      <MyTag Value="blonde" />
      <MyTag Value="1"      />
    </MyGroupingTag>
    <MyGroupingTag Group="2">
      <MyTag Value="2"        />
      <MyTag Value="Agnes"    />    
      <MyTag Value="61"       />
      <MyTag Value="white"    />
      <MyTag Value="0"        />
    </MyGroupingTag>
    <MyGroupingTag Group="3">
      <MyTag Value="3"         />
      <MyTag Value="Diane"     />    
      <MyTag Value="43"        />
      <MyTag Value="brunette"  />
      <MyTag Value="1"         />
    </MyGroupingTag>
</MyRootElement>
Run Code Online (Sandbox Code Playgroud)

由于 MyGroupingTag 中的 Group 属性,我不能使用类似的东西

SELECT... FOR XML PATH('MyTag'), ROOT('MyGroupingTag')

Group 本身就是一个简单的行数。

Mik*_*son 5

您想要生成的 XML 看起来有点奇怪。您依靠元素位置来区分什么是什么值。

declare @T table
(
  ID  int,
  Name varchar(10),
  Age int,
  HairColor varchar(10),
  HasCar bit
);

insert into @T(ID, Name, Age, HairColor, HasCar) values
(1, 'Bert' , 25, 'blonde'  , 1),
(2, 'Agnes', 61, 'white'   , 0),
(3, 'Diane', 43, 'brunette', 1);

select row_number() over(order by T.ID) as '@Group',
       T.ID as 'MyTag/@Value',
       null,
       T.Name as 'MyTag/@Value',
       null,
       T.Age as 'MyTag/@Value',
       null,
       T.HairColor as 'MyTag/@Value',
       null,
       T.HasCar as 'MyTag/@Value'
from @T as T
for xml path('MyGroupingTag'), root('MyRootElement');
Run Code Online (Sandbox Code Playgroud)

这可能会生成更好的 XML 版本。

select row_number() over(order by T.ID) as '@Group',
       'ID' as 'MyTag/@Name',
       T.ID as 'MyTag/@Value',
       null,
       'Name' as 'MyTag/@Name',
       T.Name as 'MyTag/@Value',
       null,
       'Age' as 'MyTag/@Name',
       T.Age as 'MyTag/@Value',
       null,
       'HairColor' as 'MyTag/@Name',
       T.HairColor as 'MyTag/@Value',
       null,
       'HasCar' as 'MyTag/@Name',
       T.HasCar as 'MyTag/@Value'
from @T as T
for xml path('MyGroupingTag'), root('MyRootElement');
Run Code Online (Sandbox Code Playgroud)

结果:

<MyRootElement>
  <MyGroupingTag Group="1">
    <MyTag Name="ID" Value="1" />
    <MyTag Name="Name" Value="Bert" />
    <MyTag Name="Age" Value="25" />
    <MyTag Name="HairColor" Value="blonde" />
    <MyTag Name="HasCar" Value="1" />
  </MyGroupingTag>
  <MyGroupingTag Group="2">
    <MyTag Name="ID" Value="2" />
    <MyTag Name="Name" Value="Agnes" />
    <MyTag Name="Age" Value="61" />
    <MyTag Name="HairColor" Value="white" />
    <MyTag Name="HasCar" Value="0" />
  </MyGroupingTag>
  <MyGroupingTag Group="3">
    <MyTag Name="ID" Value="3" />
    <MyTag Name="Name" Value="Diane" />
    <MyTag Name="Age" Value="43" />
    <MyTag Name="HairColor" Value="brunette" />
    <MyTag Name="HasCar" Value="1" />
  </MyGroupingTag>
</MyRootElement>
Run Code Online (Sandbox Code Playgroud)

所述null列中的列表中的列之间是有分开MyTag成不同的元件。