各位老师:
问题是这个样子滴,在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
谢谢大家