T-SQL для XML. Как получить все element_ID для каждой меры (пример данных) - PullRequest
1 голос
/ 29 октября 2019

Я пытаюсь извлечь все Element_ID значения для каждого из measure. Хитрость здесь в том, что набор отличается для каждой меры, возможно ли это с T-SQL? У меня нет ссылки / схемы для этого xml.

Ниже приведены примеры данных, как видно для AWC, имеют 5 элементов данных для ABA 10 +.

Желаемый выводдолжен выглядеть примерно так:

AWC   collmeth    A
AWC   eligpop     30125
AWC   myyear      2018
etc..

Спасибо всем.

Пробовал этот XQuery, но не смог

DECLARE @xml XML;

SET @xml = (SELECT col FROM #x)

SELECT doc.value ('(value/text/())[1]', 'nvarchar(max)') AS 'key' 
FROM @xml.nodes('/submission/component/data/measures/measure/data-elements/data-element') AS ref(doc)

XQuery [value ()]: Синтаксисошибка около '(', ожидаемое выражение шага.

DECLARE @xml XML = '<?xml version="1.0" encoding="utf-8"?>
<submission xmlns="https://www.mscbs.gob.es" guid="122134566-3344556-4334455-12343456" vendor-id="111111">
    <metadata>
        <version>40</version>
        <timestamp/>
        <sub-id>12122018</sub-id>
        <year-end-date>12/31/2017</year-end-date>
        <audit>true</audit>
    </metadata>
    <component type="GS">
        <audit>
            <measures>
                <measure id="awc">                  <reported>true</reported>               </measure>
                <measure id="aba">                  <reported>true</reported>               </measure>
            </measures>     
        </audit>
        <data>
            <measures>
                <measure id="awc" measure-version-id ="AWC_Version_Test">
                    <data-elements>
                        <data-element id="collmeth">        <value>A</value>                    </data-element>
                        <data-element id="eligpop">         <value>30125</value>                </data-element>
                        <data-element id="myear">           <value>2018</value>                 </data-element>
                        <data-element id="nuadm">           <value>12925</value>                </data-element>
                        <data-element id="nusup">           <value>0</value>                    </data-element>
                    </data-elements>
            </measure>
            <measure id="aba" measure-version-id ="ABA_Version_TEST">
                    <data-elements>
                        <data-element id="admexc">                          <value>0</value>                        </data-element>
                        <data-element id="collmeth">                            <value>H</value>                        </data-element>
                        <data-element id="den">                         <value>147</value>                      </data-element>
                        <data-element id="elignu">                          <value>11829</value>                        </data-element>
                        <data-element id="eligpop">                         <value>21118</value>                        </data-element>
                        <data-element id="empexc">                          <value>0</value>                        </data-element>
                        <data-element id="mrssnu">                          <value>99</value>                       </data-element>
                        <data-element id="medexc">                          <value>0</value>                        </data-element>
                        <data-element id="mrssize">                         <value>147</value>                      </data-element>
                        <data-element id="myear">                           <value>2018</value>                     </data-element>
                        <data-element id="nuadm">                           <value>81</value>                       </data-element>
                        <data-element id="numed">                           <value>36</value>                       </data-element>
                        <data-element id="nusup">                           <value>18</value>                       </data-element>
                        <data-element id="overrate">                            <value>0.02</value>                     </data-element>
                        <data-element id="subadded">                            <value>0</value>                        </data-element>
                        <data-element id="veexc">                           <value>0</value>                        </data-element>
                    </data-elements>                
            </measure>
         </measures>
        </data>
    </component>
</submission>
'

SELECT @xml col INTO #x

SELECT * FROM #x

1 Ответ

3 голосов
/ 29 октября 2019

Пожалуйста, попробуйте следующее. Он заботится о пространстве имен по умолчанию, а также об отношениях один ко многим.

T-SQL

-- DDL and sample data population, start
DECLARE @xml XML = '<?xml version="1.0" encoding="utf-8"?>
<submission xmlns="https://www.mscbs.gob.es" guid="122134566-3344556-4334455-12343456"
            vendor-id="111111">
    <metadata>
        <version>40</version>
        <timestamp/>
        <sub-id>12122018</sub-id>
        <year-end-date>12/31/2017</year-end-date>
        <audit>true</audit>
    </metadata>
    <component type="GS">
        <audit>
            <measures>
                <measure id="awc">
                    <reported>true</reported>
                </measure>
                <measure id="aba">
                    <reported>true</reported>
                </measure>
            </measures>
        </audit>
        <data>
            <measures>
                <measure id="awc" measure-version-id="AWC_Version_Test">
                    <data-elements>
                        <data-element id="collmeth">
                            <value>A</value>
                        </data-element>
                        <data-element id="eligpop">
                            <value>30125</value>
                        </data-element>
                        <data-element id="myear">
                            <value>2018</value>
                        </data-element>
                        <data-element id="nuadm">
                            <value>12925</value>
                        </data-element>
                        <data-element id="nusup">
                            <value>0</value>
                        </data-element>
                    </data-elements>
                </measure>
                <measure id="aba" measure-version-id="ABA_Version_TEST">
                    <data-elements>
                        <data-element id="admexc">
                            <value>0</value>
                        </data-element>
                        <data-element id="collmeth">
                            <value>H</value>
                        </data-element>
                        <data-element id="den">
                            <value>147</value>
                        </data-element>
                        <data-element id="elignu">
                            <value>11829</value>
                        </data-element>
                        <data-element id="eligpop">
                            <value>21118</value>
                        </data-element>
                        <data-element id="empexc">
                            <value>0</value>
                        </data-element>
                        <data-element id="mrssnu">
                            <value>99</value>
                        </data-element>
                        <data-element id="medexc">
                            <value>0</value>
                        </data-element>
                        <data-element id="mrssize">
                            <value>147</value>
                        </data-element>
                        <data-element id="myear">
                            <value>2018</value>
                        </data-element>
                        <data-element id="nuadm">
                            <value>81</value>
                        </data-element>
                        <data-element id="numed">
                            <value>36</value>
                        </data-element>
                        <data-element id="nusup">
                            <value>18</value>
                        </data-element>
                        <data-element id="overrate">
                            <value>0.02</value>
                        </data-element>
                        <data-element id="subadded">
                            <value>0</value>
                        </data-element>
                        <data-element id="veexc">
                            <value>0</value>
                        </data-element>
                    </data-elements>
                </measure>
            </measures>
        </data>
    </component>
</submission>';
-- DDL and sample data population, end

;WITH XMLNAMESPACES (DEFAULT 'https://www.mscbs.gob.es')
SELECT c.value('@id','VARCHAR(10)') AS [measure-id]
    , x.value('@id','VARCHAR(10)') AS [data-element-id]
    , x.value('(value/text())[1]','VARCHAR(10)') AS [data-element-value]
FROM @xml.nodes('/submission/component/data/measures/measure') AS t(c)
    CROSS APPLY t.c.nodes('data-elements/data-element') as f(x);

Вывод :

+------------+-----------------+--------------------+
| measure-id | data-element-id | data-element-value |
+------------+-----------------+--------------------+
| awc        | collmeth        | A                  |
| awc        | eligpop         | 30125              |
| awc        | myear           | 2018               |
| awc        | nuadm           | 12925              |
| awc        | nusup           | 0                  |
| aba        | admexc          | 0                  |
| aba        | collmeth        | H                  |
| aba        | den             | 147                |
| aba        | elignu          | 11829              |
| aba        | eligpop         | 21118              |
| aba        | empexc          | 0                  |
| aba        | mrssnu          | 99                 |
| aba        | medexc          | 0                  |
| aba        | mrssize         | 147                |
| aba        | myear           | 2018               |
| aba        | nuadm           | 81                 |
| aba        | numed           | 36                 |
| aba        | nusup           | 18                 |
| aba        | overrate        | 0.02               |
| aba        | subadded        | 0                  |
| aba        | veexc           | 0                  |
+------------+-----------------+--------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...