none
sql openxml 查询路径的问题 RRS feed

  • 问题

  • 各位老师:

    问题是这个样子滴,在msdn上有这样的例子:

    DECLARE @docHandle int
    DECLARE @XmlDocument nvarchar(1000)
    SET @XmlDocument = N'<ROOT>
    <Customer CustomerID="VINET" ContactName="Paul Henriot">
       <Order EmployeeID="5" >
          <OrderID>10248</OrderID>
          <CustomerID>VINET</CustomerID>
          <OrderDate>1996-07-04T00:00:00</OrderDate>
          <OrderDetail ProductID="11" Quantity="12"/>
          <OrderDetail ProductID="42" Quantity="10"/>
       </Order>
    </Customer>
    <Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
       <Order  EmployeeID="3" >
          <OrderID>10283</OrderID>
          <CustomerID>LILAS</CustomerID>
          <OrderDate>1996-08-16T00:00:00</OrderDate>
          <OrderDetail ProductID="72" Quantity="3"/>
       </Order>
    </Customer>
    </ROOT>'
    -- Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @docHandle OUTPUT, @XmlDocument
    -- Execute a SELECT statement using OPENXML rowset provider.
    SELECT *
    FROM OPENXML (@docHandle, '/ROOT/Customer/Order/OrderDetail',2)
    WITH (
          ProductID int  '@ProductID',
          OrderID int '../OrderID'
          )
    EXEC sp_xml_removedocument @docHandle

    ----------------------------------------------------------------------------------

    ok,好吧,我承认,这个例子我看的明白,用这种做法,也能够解析xml文件没问题

    我的想法是:

    在这句代码中FROM OPENXML (@docHandle, '/ROOT/Customer/Order/OrderDetail',2)

    '/ROOT/Customer/Order/OrderDetail',应该是个xpath的搜索路径,是说按照绝对路径/Root一路找下来,找到OrderDetail'这个元素

    然后输出了他的ProductID,OrderID,现在一切正常,都能够输出;

    现在我想改一下输出路径,我这样写'/ROOT/Customer/Order/',整个代码是这样的

    SELECT *
    FROM OPENXML (@docHandle, '/ROOT/Customer/Order',2)
    WITH (
          ProductID int  'OrderDetail/@ProductID',
          OrderID int 'OrderID'
          )

    现在问题出现了,这样只能输出每个Order下面的第一个 OrderDetail中的信息

    请指点问题出在哪里?以及如何改进使得输出所有的符合条件的OrderDetail

     

    谢谢大家

    2011年4月27日 7:31

答案

  • OPENXML (@docHandle, '/ROOT/Customer/Order',2)

    决定条集的记录数,这里输出的结点有几个, 就有几条记录

    WITH 是取对应的每条记录的列值,所以你修改了之后,如果 order 下面是多个 Detial, 只会输出里面的第一个

    2011年4月28日 2:19