sql >> Database >  >> RDS >> Sqlserver

XML versnipperen van uitvoeringsplannen

Een heel directe manier zou dit kunnen zijn (terwijl @x is uw XML-uitvoeringsplan):

DECLARE @x XML=
N'<root>
    <ElementE1 AttributA1="A1-text belongs to E1[1]" OneMore="xyz">E1-Text 2</ElementE1>
    <ElementE1 AttributA1="A1-text belongs to E1[2]">E1-Text 2</ElementE1>
    <ElementParent>
      <subElement test="sub"/>
      Free text
    </ElementParent>
  </root>';

DECLARE @idoc INT;
EXEC sp_xml_preparedocument @idoc OUTPUT, @x;   
SELECT * FROM OPENXML (@idoc, '*');   
EXEC sp_xml_removedocument @idoc;  

Het resultaat (niet alle kolommen)

+----+----------+----------+--------------+------+--------------------------+
| id | parentid | nodetype | localname    | prev | text                     |
+----+----------+----------+--------------+------+--------------------------+
| 0  | NULL     | 1        | root         | NULL | NULL                     |
+----+----------+----------+--------------+------+--------------------------+
| 2  | 0        | 1        | ElementE1    | NULL | NULL                     |
+----+----------+----------+--------------+------+--------------------------+
| 3  | 2        | 2        | AttributA1   | NULL | NULL                     |
+----+----------+----------+--------------+------+--------------------------+
| 13 | 3        | 3        | #text        | NULL | A1-text belongs to E1[1] |
+----+----------+----------+--------------+------+--------------------------+
| 4  | 2        | 2        | OneMore      | NULL | NULL                     |
+----+----------+----------+--------------+------+--------------------------+
| 14 | 4        | 3        | #text        | NULL | xyz                      |
+----+----------+----------+--------------+------+--------------------------+
| 5  | 2        | 3        | #text        | NULL | E1-Text 2                |
+----+----------+----------+--------------+------+--------------------------+
| 6  | 0        | 1        | ElementE1    | 2    | NULL                     |
+----+----------+----------+--------------+------+--------------------------+
| 7  | 6        | 2        | AttributA1   | NULL | NULL                     |
+----+----------+----------+--------------+------+--------------------------+
| 15 | 7        | 3        | #text        | NULL | A1-text belongs to E1[2] |
+----+----------+----------+--------------+------+--------------------------+
| 8  | 6        | 3        | #text        | NULL | E1-Text 2                |
+----+----------+----------+--------------+------+--------------------------+
| 9  | 0        | 1        | ElementParent| 6    | NULL                     |
+----+----------+----------+--------------+------+--------------------------+
| 10 | 9        | 1        | subElement   | NULL | NULL                     |
+----+----------+----------+--------------+------+--------------------------+
| 11 | 10       | 2        | test         | NULL | NULL                     |
+----+----------+----------+--------------+------+--------------------------+
| 16 | 11       | 3        | #text        | NULL | sub                      |
+----+----------+----------+--------------+------+--------------------------+
| 12 | 9        | 3        | #text        | 10   | Free text                |
+----+----------+----------+--------------+------+--------------------------+

De id laat duidelijk zien dat het algoritme breedte eerst . is , er is geen id=1 (waarom ooit) en het nodetype maakt het mogelijk om onderscheid te maken tussen elementen, attributen en (zwevende) tekst. De prev kolom wijst naar een broer of zus hoger in de keten. De ontbrekende kolommen hebben betrekking op naamruimten...

De aanpak met FROM OPENXML is verouderd, maar dit is een van de zeldzame situaties waarin het nog steeds erg handig kan zijn...

Je krijgt een lijst met ID's en ParentID's die je zou kunnen opvragen met een recursieve CTE... Dit hangt ervan af wat je er later mee wilt doen...



  1. Foutmelding Plugin 'InnoDB'-registratie als STORAGE ENGINE mislukt bij het starten van MySQL

  2. Fatale fout:niet-gevangen uitzondering 'mysqli_sql_exception' met bericht 'Geen index gebruikt in query/voorbereide instructie'

  3. 7 dingen die u moet weten over compartimenten op Oracle Cloud Infrastructure

  4. SET IDENTITY_INSERT postgresql