Как л oop xml в магазине процедуры - PullRequest
0 голосов
/ 07 января 2020

У меня есть процедура хранения, которая возвращает следующее XML:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header />
  <SOAP-ENV:Body>
    <ns2:ReportResponse>
      <ns2:responseTitle />
      <ns2:responseBody>
        <ns2:resultRow>
          <ns2:result Name="country" Value="United Kingdom" />
          <ns2:result Name="code" Value="7360" />
        </ns2:resultRow>
        <ns2:resultRow>
          <ns2:result Name="country" Value="France" />
          <ns2:result Name="code" Value="7340" />
        </ns2:resultRow>
      </ns2:responseBody>
    </ns2:ReportResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Я хочу иметь возможность сохранить 2 записи в таблице, как я могу получить все oop, чтобы получить данные?

Запись 1: код страны = Великобритания = 7360

Запись 2: код страны = Франция = 7340

Я пытался использовать этот выбор, но он ничего не возвращает .

SELECT 
    Record.value('@Name','VARCHAR')
FROM @XmlResponse.nodes('/Envelope/Body/ReportResponse/responseBody/resultRow')AS TEMPTABLE(Record)

Спасибо.

1 Ответ

0 голосов
/ 07 января 2020

Вот так:

declare @doc xml = '
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header />
  <SOAP-ENV:Body>
    <ns2:ReportResponse xmlns:ns2="http://whatever">
      <ns2:responseTitle />
      <ns2:responseBody>
        <ns2:resultRow>
          <ns2:result Name="country" Value="United Kingdom" />
          <ns2:result Name="code" Value="7360" />
        </ns2:resultRow>
        <ns2:resultRow>
          <ns2:result Name="country" Value="France" />
          <ns2:result Name="code" Value="7340" />
        </ns2:resultRow>
      </ns2:responseBody>
    </ns2:ReportResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
';

WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' as soap ,
                    'http://whatever' as ns2)
SELECT 
    Record.value('(ns2:result[@Name="country"])[1]/@Value','VARCHAR(20)') Country,
    Record.value('(ns2:result[@Name="code"])[1]/@Value','int') Code
FROM @doc.nodes('/soap:Envelope/soap:Body/ns2:ReportResponse/ns2:responseBody/ns2:resultRow')AS TEMPTABLE(Record)

выходы

Country              Code
-------------------- -----------
United Kingdom       7360
France               7340

(2 rows affected)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...