address
ノードを持つソースXML
ファイルがあり、各ノードの検証にはzip_code
ノードがあるはずです。少なくとも1つのノードにzip_codeが存在しないため(ファイルに数千のアドレスがあるため)、スキーマの検証に失敗したファイルを受信しました。存在しないノードのxmlを検索するTSQLの方が良い
私たちはファイルを修復し、ソースに監査レポートを送信するために、郵便番号を持たない要素を見つける必要があります。
--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
機能でいくつかのバリエーションを試しましたが、正しい結果が得られませんでした。
1良い答え。 –
実際、私はその反対を探しています。 zipを持たないノードを特定する必要があるため、ソースデータを手動で修正することができます。 –
申し訳ありませんが、私は誤解しました。私は 'zip_code'を持たない' address'要素だけをどのように扱うことができるかの例を更新しました。 –