如何使用MS SQL解析XML属性

时间:2013-12-06 14:23:14

标签: sql sql-server xml sql-server-2008 sqlxml

我需要使用MS SQL查询

获取XML文档中存在的属性值

Ex:我的XML看起来如下

<trade xmlns="www.somewebsite.com" Action = "Insert" TradeNumber = "1053" Volume = "25" DateTime = "2013-12-06T10:22:47.497" PNC = "false">
     <Specifier Specifierid = "112" Span = "Single" Name = "Indian"/>
</trade>

我需要获取

  1. 交易标记中的“TradeNumber”,“Volume”,“DateTime”的值

  2. 说明符标记

  3. 中的“名称”

    在其特定列

    下的单行中

    喜欢

    TradeNumber  Volume   DateTime    Name
    1053      25  2013-12-06T10:22:47.497 Indian
    

    我试过很多方法,但无法弄明白。 请帮忙

2 个答案:

答案 0 :(得分:1)

declare @data xml ='
<trade xmlns="www.somewebsite.com" Action = "Insert" TradeNumber = "1053" Volume = "25" DateTime = "2013-12-06T10:22:47.497" PNC = "false">
     <Specifier Specifierid = "112" Span = "Single" Name = "Indian"/>
</trade>'

;with xmlnamespaces(default 'www.somewebsite.com')
select 
    @data.value('trade[1]/@TradeNumber', 'int') as TradeNumber,
    @data.value('trade[1]/@Volume', 'int') as Volume,
    @data.value('trade[1]/@DateTime', 'datetime') as [DateTime],
    @data.value('(trade/Specifier)[1]/@Name', 'nvarchar(max)') as Name

--------------------------------------------------------
TradeNumber Volume  DateTime                Name
       1053     25  2013-12-06 10:22:47.497 Indian

或者,如果可能有多个交易:

;with xmlnamespaces(default 'www.somewebsite.com')
select 
    t.c.value('@TradeNumber', 'int') as TradeNumber,
    t.c.value('@Volume', 'int') as Volume,
    t.c.value('@DateTime', 'datetime') as [DateTime],
    t.c.value('Specifier[1]/@Name', 'nvarchar(max)') as Name
from @data.nodes('trade') as t(c)

答案 1 :(得分:0)

另一种变体:

declare @doc xml

select @doc= '
<trade xmlns="www.somewebsite.com" Action = "Insert" TradeNumber = "1053" Volume = "25" DateTime = "2013-12-06T10:22:47.497" PNC = "false">
     <Specifier Specifierid = "112" Span = "Single" Name = "Indian"/>
</trade>
'



;WITH XMLNAMESPACES('www.somewebsite.com' AS p)
SELECT 
      ActionAttribute = Y.i.value('(@Action)[1]', 'varchar(40)')
    , TradeNumber = Y.i.value('@TradeNumber[1]', 'varchar(40)') 
    , Specifierid = Y.i.value('(./p:Specifier)[1]/@Specifierid', 'nvarchar(max)') 
FROM 
    @doc.nodes('/p:trade') AS Y(i)