sql >> データベース >  >> RDS >> Sqlserver

実行プランからのXMLのシュレッダー

    非常に簡単な方法はこれである可能性があります(@x XML実行計画です):

    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;  
    

    結果(すべての列ではありません)

    +----+----------+----------+--------------+------+--------------------------+
    | 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                |
    +----+----------+----------+--------------+------+--------------------------+
    

    id アルゴリズムが幅優先であることを明確に示しています 、id=1はありません (なぜ)そしてnodetype 要素、属性、および(フローティング)テキストを区別できます。 prev 列は、チェーン内の兄弟を指します。欠落している列は名前空間に関連しています...

    FROM OPENXMLを使用したアプローチ 時代遅れですが、これはまだ非常に役立つ可能性があるまれな状況の1つです...

    再帰CTEでクエリできるIDとParentIDのリストを取得します...これは、後でこれをどのように処理するかによって異なります...



    1. Oracle-WITH CLAUSE => MERGE? (構文エラー、 )

    2. java.sql.DriverManager.getConnection(...)がハングしているのはなぜですか?

    3. MySQL EntityFramework6でコンソールアプリを実行しようとしたときにConfigurationErrorExceptionが発生しました

    4. PostgreSQLの日付に月を追加