Sql server T-SQL生成XML

Sql server T-SQL生成XML,sql-server,xml,tsql,Sql Server,Xml,Tsql,我有一张有以下结构的桌子 StreetNumber varchar(50) Apartment varchar(50) Floor varchar(50) 我想将数据转换为XML,如下所示: <Attributes> <AddressAttribute ID="1"> <AddressAttributeValue> <Value>3</Value> </Addres

我有一张有以下结构的桌子

StreetNumber varchar(50)
Apartment varchar(50)
Floor varchar(50)
我想将数据转换为XML,如下所示:

<Attributes>
    <AddressAttribute ID="1">
        <AddressAttributeValue>
            <Value>3</Value>
        </AddressAttributeValue>
    </AddressAttribute>
    <AddressAttribute ID="3">
        <AddressAttributeValue>
            <Value>1</Value>
        </AddressAttributeValue>
    </AddressAttribute>
    <AddressAttribute ID="2">
        <AddressAttributeValue>
            <Value>2</Value>
        </AddressAttributeValue>
    </AddressAttribute>
</Attributes>

有没有办法将每个列转换为具有相同名称且仅在属性ID上不同的元素?

您可以在列列表的子查询中创建XML,在该子查询中取消表构造函数中的值,为每个列提供一个ID

下面是一个使用表变量作为数据源的示例。你当然应该用你的桌子代替

声明@T表 街号varchar50, 瓦查尔50公寓, 地板varchar50 ; 插入@T values'街'、'公寓'、'楼'; 选择 选择R.ID作为'@ID', R.值为“AddressAttributeValue/Value” 根据值1,T.街道编号, 2,T.公寓, 3,T.地板作为RID,价值 对于xml路径'AddressAttribute',根'Attributes',键入 从@T作为T; 结果:

大街 公寓 地板
已经有一个公认的答案了,这很好。作为替代方案

简要说明:通常情况下,引擎不允许在同一级别一次性放置多个同名元素。但是,中间的空元素告诉引擎关闭一个元素并启动一个新元素

DECLARE @Addr TABLE(StreetNumber varchar(50),Apartment varchar(50),Floor varchar(50));
INSERT INTO @Addr VALUES('SomeStreet', 'App 1', 'Floor 2');

SELECT 1 AS [AddressAttribute/@ID]
      ,a.StreetNumber [AddressAttribute/AddressAttributeValue/Value]
      ,''
      ,2 AS [AddressAttribute/@ID]
      ,a.Apartment [AddressAttribute/AddressAttributeValue/Value]
      ,''
      ,3 AS [AddressAttribute/@ID]
      ,a.Floor AS [AddressAttribute/AddressAttributeValue/Value]
      ,''
FROM @Addr AS a      
FOR XML PATH(''),ROOT('Attributes');
结果

<Attributes>
  <AddressAttribute ID="1">
    <AddressAttributeValue>
      <Value>SomeStreet</Value>
    </AddressAttributeValue>
  </AddressAttribute>
  <AddressAttribute ID="2">
    <AddressAttributeValue>
      <Value>App 1</Value>
    </AddressAttributeValue>
  </AddressAttribute>
  <AddressAttribute ID="3">
    <AddressAttributeValue>
      <Value>Floor 2</Value>
    </AddressAttributeValue>
  </AddressAttribute>
</Attributes>

非常感谢你再次感谢你的回答。我可以阻止选择空元素吗?例如,我不需要不带值的整个AddressAttribute元素。@SergöIsupov将where子句添加到子查询中。其中R.值不为null