Любой подход к выполнению этого на строковом уровне является неправильным (из-за различных XML макетов, которые семантически равны и, следовательно, возможны на любом этапе).
Попробуйте что-то подобное:
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<X C="1"></X>')
,(N'<X A="huh?" C="1"></X>')
,(N'<X C="2"></X>')
,(N'<X C="1"></X><X C="2"></X>')
,(N'<Y C="1"></Y>')
,(N'<root>some other</root>')
;
SELECT t.*
,CASE WHEN t.xmldata.query(N'count(/*)>1').value('.','bit')=1 THEN 'X' END MoreThanOneNodeInLevel1
,CASE WHEN t.xmldata.query(N'count(/*[1]/@*)>1').value('.','bit')=1 THEN 'X' END MoreThanOnAttributeInFirstElement
,CASE WHEN t.xmldata.query(N'/X[1]/@C != "1"').value('.','bit')=1 THEN 'X' END Attribute_X_C_isNot1
,CASE WHEN t.xmldata.query(N'local-name(/*[1])!="X"').value('.','bit')=1 THEN 'X' END FirstElementIsNotNamedX
FROM @tbl t;
Результат
+----+-------------------------+-------------------------+-----------------------------------+----------------------+-------------------------+
| ID | xmldata | MoreThanOneNodeInLevel1 | MoreThanOnAttributeInFirstElement | Attribute_X_C_isNot1 | FirstElementIsNotNamedX |
+----+-------------------------+-------------------------+-----------------------------------+----------------------+-------------------------+
| 1 | <X C="1" /> | NULL | NULL | NULL | NULL |
+----+-------------------------+-------------------------+-----------------------------------+----------------------+-------------------------+
| 2 | <X A="huh?" C="1" /> | NULL | X | NULL | NULL |
+----+-------------------------+-------------------------+-----------------------------------+----------------------+-------------------------+
| 3 | <X C="2" /> | NULL | NULL | X | NULL |
+----+-------------------------+-------------------------+-----------------------------------+----------------------+-------------------------+
| 4 | <X C="1" /><X C="2" /> | X | NULL | NULL | NULL |
+----+-------------------------+-------------------------+-----------------------------------+----------------------+-------------------------+
| 5 | <Y C="1" /> | NULL | NULL | NULL | X |
+----+-------------------------+-------------------------+-----------------------------------+----------------------+-------------------------+
| 6 | <root>some other</root> | NULL | NULL | NULL | X |
+----+-------------------------+-------------------------+-----------------------------------+----------------------+-------------------------+
Как видите, только первая строка NULL
во всех столбцах.
Идея вкратце:
Ваш XML имеет - 1 единственный элемент на уровне 1 - Этот элемент имеет 1 единственный атрибут - "C" - значение атрибута в первом элементе = "1" - локальное имя первого элемента - "X" "
В примеры данных я добавил различные" неправильные "XML экземпляры.
Возможно, вам потребуется добавить больше правил.
Подсказка: вы можете поместить выражение в предложение WHERE или использовать XML.exist()
.