2012-12-20 84 views
1

我有这样的SQL查询中使用FOR XML EXPLICIT:TSQL FOR XML显 - 添加属性元素

declare @address table 
(
    AddressID int, 
    AddressType varchar(12), 
    Address1 varchar(20), 
    Address2 varchar(20), 
    City varchar(25) 
)  
insert into @address 
select 1, 'Home', 'abc', 'xyz road', 'RJ' union all 
select 2, 'Office', 'temp', 'ppp road', 'RJ' union all 
select 3, 'Temp', 'eee', 'olkiu road', 'CL' 

SELECT 
    1 AS Tag,NULL AS Parent, 
    0 AS 'AddressCollection!1!Sort!hide', 
    NULL AS 'AddressCollection!1!', 
    NULL AS 'Address!2!AddressID', 
    NULL AS 'Address!2!AddressType!Element', 
    NULL AS 'Address!2!Address1!Element', 
    NULL AS 'Address!2!Address2!Element', 
    NULL AS 'Address!2!City!Element' 
UNION ALL 
SELECT 
    2 AS Tag,1 AS Parent,AddressID * 100,NULL, 
    AddressID,AddressType, Address1, Address2, City 
    FROM @address 
ORDER BY [AddressCollection!1!Sort!hide] 
FOR XML EXPLICIT 

和XML的结果是:

<AddressCollection> 
    <Address AddressID="1"> 
    <AddressType>Home</AddressType> 
    <Address1>abc</Address1> 
    <Address2>xyz road</Address2> 
    <City>RJ</City> 
    </Address> 
    <Address AddressID="2"> 
    <AddressType>Office</AddressType> 
    <Address1>temp</Address1> 
    <Address2>ppp road</Address2> 
    <City>RJ</City> 
    </Address> 
    <Address AddressID="3"> 
    <AddressType>Temp</AddressType> 
    <Address1>eee</Address1> 
    <Address2>olkiu road</Address2> 
    <City>CL</City> 
    </Address> 
</AddressCollection> 

我如何添加属性元件?我已经正确地将它们添加到父标记中,但我不知道如何将它们添加到元素标记。

我需要的是这样的:

<AddressCollection> 
    <Address AddressID="1"> 
    <AddressType>Home</AddressType> 
    <Address1>abc</Address1> 
    <Address2>xyz road</Address2> 
    <City status="modified">RJ</City> 
    </Address> 
    <Address AddressID="2"> 
    <AddressType status="modified">Office</AddressType> 
    <Address1>temp</Address1> 
    <Address2>ppp road</Address2> 
    <City>RJ</City> 
    </Address> 
    <Address AddressID="3"> 
    <AddressType>Temp</AddressType> 
    <Address1 status="modified">eee</Address1> 
    <Address2>olkiu road</Address2> 
    <City>CL</City> 
    </Address> 
</AddressCollection> 
+0

什么数据identigy这在每个记录列被修改? –

+0

我必须做另一个SQL查询才能获取这些信息,但重点是如何在元素上设置属性。这样做后不是问题确定哪列被修改。谢谢。 – epi82

+0

您是否找到了解决方案?我需要相同的东西,不能切换到路径,因为我需要CDATA,只有显式支持。 – jwynveen

回答

2

简单沟明确和去与XML路径(),根()模型来代替:

XML明确的是一个完全和总疼痛恕我直言。我不会使用它,除非有某些原因被迫。您可以通过少得多的XML Path或XML Auto学习来完成更多任务。

declare @address table 
(
    AddressID int, 
    AddressType varchar(12), 
    Address1 varchar(20), 
    Address2 varchar(20), 
    City varchar(25) 
)  
insert into @address 
select 1, 'Home', 'abc', 'xyz road', 'RJ' union all 
select 2, 'Office', 'temp', 'ppp road', 'RJ' union all 
select 3, 'Temp', 'eee', 'olkiu road', 'CL' 

select * 
from @address 
for xml path('Address'), root('AddressCollection') 

-- for even more control and fun: 

select 
    AddressID as "MainInfo/@ID" 
, AddressType as "MainInfo/@Type" 
, Address1 + ' ' + Address2 as "Address/*" 
, City as "Address/*" 
from @Address 
for xml path('Address'), root('AddressCollection') 
0

更正sollution的最后一部分:

select 
AddressID as "MainInfo/@ID" 
, AddressType as "Address/@Type" 
, Address1 + ' ' + Address2 as "Address/*" 
, City as "City/*" 
from @Address 
for xml path('Address'), root('AddressCollection')