FROM OPENXML
вместе с хранимой процедурой открытия и удаления XML устарели и больше не должны использоваться ... Вместо этого используйте собственные XML-методы , предоставляемые типом данных XML.
Этот маркер NULL
с xsi:nil
на самом деле не нужен.Отсутствующий элемент неявно принимается как значение NULL
.Если существование элемента вызвано схемой или каким-либо правилом, это можно использовать для различения пустой строки или NULL
.Проверьте это:
DECLARE @XML XML =
'<Elelments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- your example -->
<Elelment>
<Fee xsi:nil="true" />
<Percentage>50</Percentage>
</Elelment>
<!-- both values are set -->
<Elelment>
<Fee>100</Fee>
<Percentage>50</Percentage>
</Elelment>
<!-- Fee is missing -->
<Elelment>
<Percentage>50</Percentage>
</Elelment>
</Elelments>';
- Это вернет желаемый результат - не беспокоясь о NULL
значениях
SELECT e.value('(Fee/text())[1]','decimal(10,4)') AS Fee
,e.value('(Percentage/text())[1]','decimal(10,4)') AS Percentage
FROM @XML.nodes('/Elelments/Elelment') A(e);
- Так в чем же разница?Это вернет все узлы <Elelment>
, где есть узел <Fee>
.Вы получаете два узла обратно.Отсутствующий <Elelment>
не найден.
SELECT @XML.query('Elelments/Elelment[Fee]');
- с этим вы можете найти все <Fee>
с явным значением xsi:nil="true"
WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS xsi)
SELECT @XML.query('Elelments/Elelment[Fee/@xsi:nil="true"]');
Кстати: выдействительно назвать это <Elelment>
?Вторая буква "L" как-то меня беспокоит ...