Rozważ następujący prosty XML:
<xml>
<customer name="Max">
<email address="[email protected]" />
</customer>
<customer name="Erik">
<email address="[email protected]" />
</customer>
<customer name="Brent">
<email address="brentcom" />
</customer>
</xml>
Chcę uzyskać listę <Customer>
sekwencji, w których address
atrybut <email>
elementu nie zawiera @
.
Tak więc chcę, aby dane wyjściowe wyglądały następująco:
<customer name="Brent">
<email address="brentcom" />
</customer>
Mcve :
DECLARE @x XML = '<xml>
<customer name="Max"><email address="[email protected]" /></customer>
<customer name="Erik"><email address="[email protected]" /></customer>
<customer name="Brent"><email address="brentcom" /></customer>
</xml>';
To zapytanie:
SELECT WithValidEmail = @x.query('/xml/customer/email[contains(@address, "@")]')
, WithInvalidEmail = @x.query('/xml/customer/email[contains(@address, "@")] = False');
Zwroty:
╔═══════════════════════════════════════╦══════════════════╗
║ WithValidEmail ║ WithInvalidEmail ║
╠═══════════════════════════════════════╬══════════════════╣
║ <email address="[email protected]" /> ║ ║
║ <email address="[email protected]" /> ║ false ║
╚═══════════════════════════════════════╩══════════════════╝
To zapytanie:
SELECT WithInValidEmail = @x.query('/xml/customer/email')
WHERE @x.exist('/xml/customer/email[contains(@address, "@")]') = 0;
Zwroty:
╔══════════════════╗
║ WithInValidEmail ║
╚══════════════════╝
(no results)
WHERE
Klauzula kwerendy powyżej jest wyeliminowanie cały zestaw XML, ponieważ co najmniej jedna sekwencja występuje wówczas, gdy adres e-mail zawiera znak „@”.
źródło