2011-01-12 5 views
0

У нас есть столбец в таблице, которая содержит XML и является установкой как по нестандартной схеме столбец XMLВ чем разница между этими двумя запросами SQL Server XQuery?

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

<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) Как изменить первый запрос, чтобы просмотреть все элементы, а не только первые?

+0

Первое выражение является ** булевым ** выражением. Таким образом, он не выбирает какой-либо узел сам по себе. Вы используете определенный метод SLQ-Server, определяющий контекст оценки этого булевого выражения. Второй - выражение FLOWR, которое говорит само за себя. –

ответ

1

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

Что вы хотите сделать это первый путь является

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

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

Смежные вопросы