SQL Server 2008 — необходимо сообщить о значении в столбце XML на основе другого значения XML

#xml #sql-server-2008 #xpath

#xml #sql-server-2008 #xpath

Вопрос:

У меня есть столбец, в котором хранятся XML данные. Внутри этих данных мне нужно сообщать об одном поле, когда другое field = xxxx .

Вот мой XML:

 <?xml version="1.0" encoding="utf-16"?>
<SourceIdentifierPairs xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas">
  <SourceIdentifierPair>
    <Source>ABCPN</Source>
    <Identifier>123456789</Identifier>
  </SourceIdentifierPair>
  <SourceIdentifierPair>
    <Source>ABCMR</Source>
    <Identifier>000000123654</Identifier>
  </SourceIdentifierPair>
    <SourceIdentifierPair>
    <Source>PRIM</Source>
    <Identifier>00112233</Identifier>
  </SourceIdentifierPair>
</SourceIdentifierPairs>
  

Когда источник ABCPN мне нужно вытащить Identifier .

Ответ №1:

Искомое выражение XPath

 //SourceIdentifierPair[Source='ABCPN']/Identifier
  

Обязательно зарегистрируйте пространство имен по умолчанию.

Пример кода:

 declare @x xml = '<SourceIdentifierPairs xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas">
  <SourceIdentifierPair>
    <Source>ABCPN</Source>
    <Identifier>123456789</Identifier>
  </SourceIdentifierPair>
  <SourceIdentifierPair>
    <Source>ABCMR</Source>
    <Identifier>000000123654</Identifier>
  </SourceIdentifierPair>
    <SourceIdentifierPair>
    <Source>PRIM</Source>
    <Identifier>00112233</Identifier>
  </SourceIdentifierPair>
</SourceIdentifierPairs>'

--xpath as above, with default namespace specified
;with xmlnamespaces ('http://schemas' as ns1, default 'http://schemas')
select @x.value('(//SourceIdentifierPair[Source=''ABCPN'']/Identifier)[1]', 'nvarchar(32)') IdentifierABCPN

--more complex version of the above code (may be useful should you have more complex requirements in future)
;with xmlnamespaces ('http://schemas' as ns1)
select @x.value('(/ns1:SourceIdentifierPairs/ns1:SourceIdentifierPair[./ns1:Source/text()[.=''ABCPN'']]/ns1:Identifier/text())[1]', 'nvarchar(32)') IdentifierABCPN
  

Комментарии:

1. Итак, я понимаю это, но XML меняется с каждым сообщением. Это записи, поступающие ежедневно, и мне нужно извлечь ABCPN и сообщить об этом.