这两个SQL Server XQuery查询有什么区别?

时间:2011-01-12 11:02:48

标签: sql-server xquery

我们在表中包含一个包含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 个答案:

答案 0 :(得分:1)

第一个中的[1]表示它明确要求第一个 type元素(按文档顺序)包含SEDOL,以便匹配被制造。所以,是的,如果你说某些行首先有非SEDOL FundCode,那么它们将不匹配。

你想要做的第一种方式是

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

这会查找任何 v:type元素,使文本包含SEDOL。