Как анализировать данные XML в таблице сервера SQL - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть таблица SQL:

Create table
(
ID varchar(50) not null,
Action nvarchar(max) null
)

Столбец действия содержит данные XML. Формат:

<?xml version="1.0" encoding="UTF-8"?> 
<oo_outbound_order>   
         <oo_master>
              <Code>123</Code>
              <Name>Branan</Name> 
    </oo_master> 
    </oo_outbound_order>

Как разобрать этот столбец? Результат должен быть таким:

CODE    NAME
123     Branan

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Попробуйте следующий вариант:

DECLARE @XMLData XML = '
<oo_outbound_order>   
    <oo_master>
        <Code>123</Code>
        <Name>Branan</Name> 
    </oo_master> 
</oo_outbound_order>'

SELECT
    [Code] = Node.Data.value('Code', 'INT'),
    [Name] = Node.Data.value('Name', 'NVARCHAR(20)')
    FROM @XMLData.nodes('/oo_outbound_order/oo_master') Node(Data)
0 голосов
/ 10 сентября 2018

Очень плохая идея хранить данные XML в строковом столбце.

Еще хуже, вы храните строку, которая утверждает, что Я закодирован как utf-8! , но хранится в столбце NVARCHAR, который равен UCS-2 (почти так же, как utf-16).

Это означает, что вы должны исправить это и привести строку к XMLпрежде чем вы сможете использовать его.Вам придется выполнять эти дорогостоящие операции всякий раз, когда вы беретесь за него.Если вы можете изменить это, вы должны хранить XML в столбце с нативным типом.

Тем не менее, это можно сделать.Попробуйте это.

Create table #temp
(
ID varchar(50) not null,
[Action] nvarchar(max) null
)

INSERT INTO #temp(ID,[Action]) VALUES
('test 1',
'<?xml version="1.0" encoding="UTF-8"?> 
<oo_outbound_order>   
         <oo_master>
              <Code>123</Code>
              <Name>Branan</Name> 
    </oo_master> 
    </oo_outbound_order>');

SELECT t.ID
      ,ActionXml.value('(/oo_outbound_order/oo_master/Code/text())[1]','nvarchar(max)') AS CODE
      ,ActionXml.value('(/oo_outbound_order/oo_master/Name/text())[1]','nvarchar(max)') AS [Name]
FROM #temp t
CROSS APPLY(SELECT CAST(REPLACE(t.[Action],'encoding="UTF-8"','encoding="UTF-16"') AS XML) ActionXml) A;

drop table #temp;

Подсказка: если нет повторяющихся элементов, нет необходимости в .nodes(), как предлагают другие ответы ...

0 голосов
/ 10 сентября 2018

Есть много учебных статей о разборе xml с помощью TSQL. Например, http://www.sqlserver.info/syntax/parse-xml-with-sql-server/

DECLARE @xml xml
SET @xml = 
'<?xml version="1.0" encoding="UTF-8"?> 
<oo_outbound_order>   
         <oo_master>
              <Code>123</Code>
              <Name>Branan</Name> 
    </oo_master> 
    </oo_outbound_order>'

SELECT 
    n.value('(./Code/text())[1]','int') as CODE
 , n.value('(./Name/text())[1]','Varchar(50)') as NAME
FROM @xml.nodes('/oo_outbound_order/oo_master') as a(n)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...