У нас есть столбец в таблице, которая содержит 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) Как изменить первый запрос, чтобы просмотреть все элементы, а не только первые?
Первое выражение является ** булевым ** выражением. Таким образом, он не выбирает какой-либо узел сам по себе. Вы используете определенный метод SLQ-Server, определяющий контекст оценки этого булевого выражения. Второй - выражение FLOWR, которое говорит само за себя. –