В чем разница между этими двумя запросами SQL Server XQuery? - PullRequest
0 голосов
/ 12 января 2011

У нас есть столбец в таблице, который содержит xml и настроен как столбец xml без схемы

Данные могут содержать несколько экземпляров узла, который выглядит следующим образом:

<eq:Fund>
  <v:FundCode>
    <v:type>SEDOL</v:type>
    <v:value>3049141</v:value>
  </v:FundCode>
</eq:Fund>
<eq:Fund>
  <v:FundCode>
    <v:type>Product Provider Specific</v:type>
    <v:value>CASH</v:value>
  </v:FundCode>
</eq:Fund>

Этот запрос возвращает 448 строк:

 WITH XMLNAMESPACES ('http://schema1' as eq, 'http://schema2' as v, DEFAULT 'http://schema3')
select * from xml_request
WHERE xml_request_body.value('contains( string( (//v:type)[1] ),"SEDOL")','bit') = 1

Этот запрос возвращает 784 строки (после удаления пробелов в столбце результатов)

    WITH XMLNAMESPACES ('http://schema1' as eq, 'http://schema2' as v, DEFAULT 'http://schema3')
select xml_request.xml_request_ser, xml_request.agency_number, xml_request.policy_holder, xml_request.product,
xml_request_body.query('for $x in /eq:EQuote/eq:Request/eq:Fund where $x/v:FundCode/v:type = "SEDOL" return $x') as result
from xml_request

1) Почему они возвращают разное количество строк? Первый запрос не находит все строки, где элемент содержит SEDOL? Почему нет?

Полагаю, это может быть связано с тем, что элемент с SEDOL может быть не первым? 2) Как изменить первый запрос для просмотра всех элементов, а не только первого?

1 Ответ

1 голос
/ 12 января 2011

[1] в первом означает, что явно требуется, чтобы элемент first type (в порядке документа) содержал SEDOL, чтобы было сопоставление. Так что да, если, как вы говорите, некоторые строки сначала не имеют SEDOL FundCode, они не будут совпадать.

Первое, что вы хотите сделать, это

WHERE xml_request_body.exist('//v:type[contains(., "SEDOL")]') = 1

Это ищет любой элемент v:type, так что текст содержит SEDOL.

...