Hãy xem xét XML đơn giản sau:
<xml>
<customer name="Max">
<email address="me@you.com" />
</customer>
<customer name="Erik">
<email address="erik@your-mom.com" />
</customer>
<customer name="Brent">
<email address="brentcom" />
</customer>
</xml>
Tôi muốn có được một danh sách các <Customer>
chuỗi trong đó address
thuộc tính của <email>
vật phẩm không chứa @
.
Vì vậy, tôi muốn đầu ra trông như:
<customer name="Brent">
<email address="brentcom" />
</customer>
mcve :
DECLARE @x XML = '<xml>
<customer name="Max"><email address="me@you.com" /></customer>
<customer name="Erik"><email address="erik@your-mom.com" /></customer>
<customer name="Brent"><email address="brentcom" /></customer>
</xml>';
Truy vấn này:
SELECT WithValidEmail = @x.query('/xml/customer/email[contains(@address, "@")]')
, WithInvalidEmail = @x.query('/xml/customer/email[contains(@address, "@")] = False');
Trả về:
╔═══════════════════════════════════════╦══════════════════╗
║ WithValidEmail ║ WithInvalidEmail ║
╠═══════════════════════════════════════╬══════════════════╣
║ <email address="me@you.com" /> ║ ║
║ <email address="erik@your-mom.com" /> ║ false ║
╚═══════════════════════════════════════╩══════════════════╝
Truy vấn này:
SELECT WithInValidEmail = @x.query('/xml/customer/email')
WHERE @x.exist('/xml/customer/email[contains(@address, "@")]') = 0;
Trả về:
╔══════════════════╗
║ WithInValidEmail ║
╚══════════════════╝
(no results)
Các WHERE
điều khoản trong các truy vấn trên được loại bỏ toàn bộ các XML vì ít nhất một chuỗi duy nhất tồn tại nơi địa chỉ email có chứa một hiệu "@".