SQL Server XML数据类型查询问题

时间:2009-09-12 12:31:43

标签: sql sql-server xml sql-server-2005 tsql

请参阅下面的SQL Server 2005脚本

Declare @xmlData XML
SET @xmlData = '<?xml version="1.0"?>
<bookstore xmlns="http://myBooks">
  <book genre="autobiography" publicationdate="1981" 
      ISBN="1-861003-11-0">
    <title>The Autobiography of Benjamin Franklin</title>
    <author>
      <first-name>Benjamin</first-name>
      <last-name>Franklin</last-name>
    </author>
    <price>8.99</price>
  </book>
  <book genre="novel" publicationdate="1967" 
      ISBN="0-201-63361-2">
    <title>The Confidence Man</title>
    <author>
      <first-name>Herman</first-name>
      <last-name>Melville</last-name>
    </author>
    <price>11.99</price>
  </book>
  <book genre="philosophy" publicationdate="1991" 
      ISBN="1-861001-57-6">
    <title>The Gorgias</title>
    <author>
      <first-name>Sidas</first-name>
      <last-name>Plato</last-name>
    </author>
    <price>9.99</price>
  </book>
</bookstore>'

Select  T.Item.query('.')
From @xmlData.nodes('/bookstore/book') AS T(Item)

这个脚本应该给我所有书籍节点的列表。但它没有给出预期的行为。如果我删除XMLNS然后它工作正常。谁能解释一下?

以下工作正常。

Declare @xmlData XML
SET @xmlData = '<?xml version="1.0"?>
<bookstore>
  <book genre="autobiography" publicationdate="1981" 
      ISBN="1-861003-11-0">
    <title>The Autobiography of Benjamin Franklin</title>
    <author>
      <first-name>Benjamin</first-name>
      <last-name>Franklin</last-name>
    </author>
    <price>8.99</price>
  </book>
  <book genre="novel" publicationdate="1967" 
      ISBN="0-201-63361-2">
    <title>The Confidence Man</title>
    <author>
      <first-name>Herman</first-name>
      <last-name>Melville</last-name>
    </author>
    <price>11.99</price>
  </book>
  <book genre="philosophy" publicationdate="1991" 
      ISBN="1-861001-57-6">
    <title>The Gorgias</title>
    <author>
      <first-name>Sidas</first-name>
      <last-name>Plato</last-name>
    </author>
    <price>9.99</price>
  </book>
</bookstore>'

Select  T.Item.query('.')
From @xmlData.nodes('/bookstore/book') AS T(Item)

任何人都可以解释我如何纠正第一次scritp?我想用xmlns运行脚本。

1 个答案:

答案 0 :(得分:2)

正如您所说 - 这是因为您的原始XML数据位于XML命名空间中,如果是这种情况,您还需要在XQuery中使用该XML命名空间:

SELECT 
   T.Item.query('.')
FROM   
   @xmlData.nodes('declare namespace ns="http://myBooks";/ns:bookstore/ns:book') 
   AS T(Item)

您需要将declare namespace ns="http://myBooks";部分插入到XQuery中,然后使用已定义的命名空间前缀ns(您可以在此处使用任何内容)来引用XML对象。

马克