如何使用XQuery从SQL Server检索XML节点?

时间:2015-02-23 21:04:04

标签: sql sql-server xml xquery

我正在解决这个小谜题,并认为你可以帮助我。

所以我在SQL Server的XML Field中有这种结构吗?

<negocio>
  <qualificado>N</qualificado>
  <local>BOVESPA</local>
  <natureza>V</natureza>
  <mercado>VIS</mercado>
  <prazo />
  <isin>BRPETRACNPR6</isin>
  <especificacao>PETROBRAS PN</especificacao>
  <observacao>D</observacao>
  <quantidade>500</quantidade>
  <precoajuste>20,91</precoajuste>
  <volume>10455</volume>
  <financeironegocio liquidoneg="10398,51">
    <cblc>
      <valoropera>10455</valoropera>
      <taxaliquidacaoneg>-2,09</taxaliquidacaoneg>
      <taxaregistroneg>0</taxaregistroneg>
    </cblc>
    <bolsa>
      <taxaprazoneg>0</taxaprazoneg>
      <taxaananeg>0</taxaananeg>
      <emolumentoneg>-0,52</emolumentoneg>
    </bolsa>
    <corretora>
      <corretagemneg>-52,63</corretagemneg>
      <intermediacaoneg>-1,82</intermediacaoneg>
    </corretora>
    <cliente>
      <issneg>2,63</issneg>
      <irrfoperacoesneg>0</irrfoperacoesneg>
      <irrfdtneg>1,25</irrfdtneg>
      <outrasdespesasneg>0</outrasdespesasneg>
    </cliente>
  </financeironegocio>
</negocio>
<negocio>

这种结构重复了很多次,我需要从每一个中获取信息。我知道使用像下面这样的.value查询可以让我获得整个XML中的第一个命中。

 select texto.value('(identificador/evento/negocio/financeironegocio/cliente/issneg)[5]','varchar(100)') from #tempxml

我的问题是:如何获得其他人?如果我使用[2],[3]我可以得到它们,但我不知道每个文件中有多少节点,我需要得到所有这些节点。

有什么建议吗?

由于

1 个答案:

答案 0 :(得分:0)

你应该可以这样做:

SELECT
    issneg = XC.value('(issneg)[1]', 'varchar(25)')
FROM
    dbo.YourTableName
CROSS APPLY
    YourXmlColumnName.nodes('/negocio/financeironegocio/cliente') AS XT(XC)

基本上,这将获取与该XPath表达式匹配的XML元素(该结构中的所有<cliente>个节点)并在内存中创建一个名为XT的伪表,其中包含一列{{1} } XC类型。您现在可以查询该伪表/列以获取单个位。这将创建一个表,其行数与XML结构中的XML元素一样多。