2011-01-12 78 views
0

我们在包含XML,并设置为非架构基于XML列这2个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”表达式。 – 2011-01-12 12:44:00

回答

1

在第一的[1]意味着它明确要求第一type元件(按文档顺序)来包含SEDOL,为了一个匹配作出。所以是的,如果你说某些行首先有一个非SEDOL FundCode,它们将不匹配。

你想这样做的第一种方式是什么

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

这看起来对任何v:type元件,使得文本包含SEDOL。