Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Parsowanie XML z wielopoziomowym zagnieżdżaniem w SQL

Zakładając, że masz swój kod XML w zmiennej SQL Server o nazwie @XML , możesz użyć natywnego XQuery wsparcie w SQL Server 2005 i nowszych, aby zrobić to znacznie bardziej elegancko i wydajnie:

DECLARE @XML XML = '...(your XML here).....' 

SELECT
    RootID = @xml.value('(/Root/@ID)[1]', 'int'),
    ConditionSetOperator = XC.value('@Operator', 'varchar(50)'),
    ConditionID =  XC2.value('@ID', 'int'),
    ConditionOperator = XC2.value('@Operator', 'varchar(50)')
FROM 
    @Xml.nodes('//ConditionSet') AS XT(XC)
CROSS APPLY
    xc.nodes('Condition') AS XT2(XC2)

Daje mi to wynik

Z operatorami XQuery, takimi jak .nodes() lub .value() , możesz łatwo "rozdrobnić" dokument XML na dane relacyjne i przechowywać je w razie potrzeby.

Pierwsze wywołanie @xml.nodes('//ConditionSet') otrzyma tabelę "pseudo" dla każdego pasującego węzła - więc każdy <ConditionSet> node zostanie zwrócony w tabeli "pseudo" XT jako kolumna XC , a następnie mogę łatwo pobrać atrybuty (lub elementy XML) z tego fragmentu XML za pomocą metod XQuery, takich jak .value() .

Lub mogę nawet pobrać listę podwęzłów <Condition> dla każdego z tych <ConditionSet> węzły - za pomocą CROSS APPLY z drugim wywołaniem .nodes()




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyłączyć wszystkie ograniczenia sprawdzania w bazie danych SQL Server — samouczek SQL Server / TSQL, część 87

  2. Wiersze do wartości oddzielonych przecinkami za pomocą tagu XML

  3. Chcę ukryć skrypt procedury składowanej w SQL Server 2008

  4. Zintegrowane zabezpieczenia =Fałsz

  5. Jak usunąć zduplikowane dane z tabeli SQL?