Как разобрать атрибут XML с помощью MS SQL

Мне нужно получить значения атрибутов, присутствующих в XML-документе, с помощью запроса MS SQL.

Пример: у меня есть 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» в теге trade

  2. "Имя" из тега Specifier

в одной строке под их конкретными столбцами

Нравиться

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

Я пробовал использовать много способов, но не мог понять это. Пожалуйста помоги


person Vikas Kunte    schedule 06.12.2013    source источник
comment
я не мог понять, как создать таблицу в разделе вопросов   -  person Vikas Kunte    schedule 06.12.2013


Ответы (2)


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)
person Roman Pekar    schedule 06.12.2013
comment
Быстрее меня :) У вас есть возможность сделать исследование на основе вашего атрибута, вместо 1 вы можете указать contains(@attribute, value). Будьте осторожны. Значение всегда может вернуть только одно значение. - person Mathese F; 06.12.2013

Другой вариант:

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)
person granadaCoder    schedule 06.12.2013