Как я могу использовать пространства имен в запросе SQL XML с помощью команды «узлов»? - PullRequest
4 голосов
/ 11 июня 2009

Я пытаюсь запросить поля из следующего XML-запроса (который на самом деле является вызовом веб-службы):

<soap:Envelope xmlns:xsi="[schema]" xmlns:xsd="[shema]" xmlns:soap="[schema]">
  <soap:Body>
    <RunPackage xmlns="http://tempuri.org/">
      <xmlDoc>
        <Request>
          <SubscriberCode>543253</SubscriberCode>
          <CompanyCode>54325</CompanyCode>
          <BranchName>TestBranchName</BranchName>
          <TempWorksUserName>TempWorksUserName</TempWorksUserName>
[...]

Со следующим XML-запросом:

WITH XMLNAMESPACES('[schema]' AS soap2, DEFAULT '[schema]')

SELECT TransactionID, T2.Loc.query('data(Request/SubscriberCode)') as 'SubscriberCode'
FROM TempWorksRequest
CROSS APPLY RequestXML.nodes('soap2:Envelope/soap2:Body/RunPackage/xmlDoc') as T2(Loc)

Он работает, но не возвращает никаких повторений!

Если я создаю тот же запрос, но удаляю материал пространства имен, ТОГДА он работает Например, отлично работает следующее:

543253 54325 TestBranchName [...]

SQL-запрос:

- Определить пространство имен для MITS, чтобы мы могли использовать пространство имен MITS. WITH XMLNAMESPACES ('[схема]' КАК МЫЛО, ПО УМОЛЧАНИЮ '[Схема]')

SELECT TransactionID, T2.Loc.query ('data (Request / SubscriberCode)') как 'SubscriberCode' ОТ TempWorksRequest CROSS APPLY RequestXML.nodes ('xmlDoc') как T2 (Loc)

Есть идеи?

1 Ответ

5 голосов
/ 12 июня 2009

Нашел проблему, спасибо за Марк! Пространства имен должны быть явно объявлены.

Новый РАБОЧИЙ запрос:

WITH XMLNAMESPACES('[URI1]' AS ns, '[URI2]' AS soap) 

SELECT TransactionID, 
    T2.Loc.query('data(ns:SubscriberCode)') as 'SubscriberCode',
FROM TempWorksRequest
CROSS APPLY RequestXML.nodes('soap:Envelope/soap:Body/ns:RunPackage/ns:xmlDoc/ns:Request') as T2(Loc)
...