【问题标题】:How to parse XML attribute using MS SQL如何使用 MS SQL 解析 XML 属性
【发布时间】:2013-12-06 14:23:13
【问题描述】:

我需要使用 MS SQL 查询获取 XML 文档中存在的属性值

例如:我有一个如下所示的 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. trade标签中“TradeNumber”、“Volume”、“DateTime”的值

  2. 说明符标签中的“名称”

在其特定列下的单行中

喜欢

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

我尝试了很多方法,但无法弄清楚。 请帮忙

【问题讨论】:

  • 我无法在有问题的部分中创建表格

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


【解决方案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 您可以指定 contains(@attribute, "value")。小心价值永远只能回馈一个价值
【解决方案2】:

另一种变体:

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)

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多