Очень плохая идея хранить данные 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()
, как предлагают другие ответы ...