在SQL Server Query中附加Xml属性

时间:2014-05-29 18:37:44

标签: sql sql-server xml

我在sql server中处理xml的新手,我有一个问题,我没有找到一个例子或答案,所以如果你们可以帮助我,这将是非常有用的。

我有各种xml iside a table" T1"在xml列类型" xmlCol"下,这是xml结构:

Row 1
<icfd:Ips totalIR="0" totalIT="7223.9">
  <icfd:Tras>
    <icfd:Tra impt="AIV" ts="16" imp="517.1"/>
    <icfd:Tra impt="SRI" ts="8" imp="18.3"/>
  </icfd:Tras>
</icfd:Ips>

Row 2
<icfd:Ips totalIR="10" totalIT="123.9">
  <icfd:Tras>
    <icfd:Tra impt="AIV" ts="34" imp="345.1"/>
  </icfd:Tras>
</icfd:Ips>

我试图获得这样的结果:

Tra                     totalIR    totalIT
-------------------------------------------
AIV(517.1),SRI(18.3)    0          7223.9
AIV(345.1)              10         123.9

如何才能成为进行此查询的正确方法?

我有这个,但我无处可去:

------------------ SQL server query -----------------------

WITH 
    XMLNAMESPACES ('http://www.stwaree/icfd/3' AS icfd)
SELECT 
    B.value('@impt', 'varchar(max)') + '(' +
    B.value('@imp', 'varchar(max)') + ')' AS Tra
FROM
    [T1] CROSS APPLY [xmlCol].nodes('//icfd:Tra') AS A(B)

----------------------- Result ----------------------------

Tra        
----------
AIV(517.1)
SRI(18.3)
AIV(345.1)

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

with xmlnamespaces('http://www.stwaree/icfd/3' as icfd)
select T.XMLCol.query('for $i in /icfd:Ips/icfd:Tras/icfd:Tra 
                       return element X{concat(",", data($i/@impt), "(", data($i/@imp), ")")}'
                     ).value('substring(., 2)', 'nvarchar(max)') as Tra,
       T.XMLCol.value('/icfd:Ips[1]/@totalIR', 'varchar(10)') as totalIR,
       T.XMLCol.value('/icfd:Ips[1]/@totalIT', 'varchar(10)') as totalIT
from T;

SQL Fiddle