У нас есть исходный файл 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
, но не смог получить правильный результат.