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