У нас есть исходный XML файл с узлом address, и каждый узел должен иметь узел zip_code внизу для проверки. Мы получили файл, который не прошел проверку схемы, потому что по крайней мере у одного узла отсутствовал его zip_code (в файле было несколько тысяч адресов).
Нам нужно найти элементы, у которых нет почтового индекса, чтобы мы могли восстановить файл и отправить отчет о проверке источнику.
--declare @x xml = bulkcolumn from openrowset(bulk 'x:\file.xml',single_blob) as s
declare @x xml = N'<addresses>
<address><external_address_id>1</external_address_id><zip_code>53207</zip_code></address>
<address><external_address_id>2</external_address_id></address>
</addresses>'
declare @t xml = (
select @x.query('for $a in .//address
return
if ($a/zip_code)
then <external_address_id />
else $a/external_address_id')
)
select x.AddressID.value('.', 'int') AddressID
from @t.nodes('./external_address_id') x(AddressID)
where x.AddressID.value('.', 'int') > 0
GO
На самом деле меня беспокоит пункт where. Мне кажется, я полагаюсь на приведение значения null к 0, и это работает, но я не совсем уверен, что так должно быть. Я пробовал несколько вариантов с функцией .exist, но не смог получить правильный результат.