Нет, нет общего способа, по крайней мере, такого, который я знаю ... Представьте себе два XML-файла, которые выглядят одинаково, но у одного есть дочерний элемент, который отсутствует в другом.Это может быть та же схема или нет ...
При таком подходе вы можете получить некоторые метаданные .Запишите это в вспомогательный стол и попробуйте использовать GROUP BY
, чтобы найти семейства XML
DECLARE @tbl TABLE(ID INT IDENTITY, ShortDescr VARCHAR(100), YourXML XML);
INSERT INTO @tbl VALUES
('root and test', N'<root><test/></root>')
,('root and test and more', N'<root><test/><a /><b /></root>')
,('blah and test', N'<blah><test/></blah>')
,('no root (blah and blub)', N'<blah></blah><blub />')
,('no content', NULL)
;
SELECT t.ID
,t.ShortDescr
,CASE ISNULL(t.YourXML.value('count(/*)','int'),0)
WHEN 1 THEN 'HasRoot'
WHEN 0 THEN 'empty'
ELSE 'Fragment' END AS XmlFormat
,t.YourXML.value('local-name((/*)[1])','nvarchar(max)') AS RootName
,t.YourXML.value('local-name((/*[1]/*)[1])','nvarchar(max)') AS FirstChild
FROM @tbl t;
Результат для этого:
+----+-------------------------+-----------+----------+------------+
| ID | ShortDescr | XmlFormat | RootName | FirstChild |
+----+-------------------------+-----------+----------+------------+
| 1 | root and test | HasRoot | root | test |
+----+-------------------------+-----------+----------+------------+
| 2 | root and test and more | HasRoot | root | test |
+----+-------------------------+-----------+----------+------------+
| 3 | blah and test | HasRoot | blah | test |
+----+-------------------------+-----------+----------+------------+
| 4 | no root (blah and blub) | Fragment | blah | |
+----+-------------------------+-----------+----------+------------+
| 5 | no content | empty | NULL | NULL |
+----+-------------------------+-----------+----------+------------+