日期:2014-05-17  浏览次数:20475 次

怎么读取用户自己定义的XML
一般在存储过程里,遇到前台传入的XML可以用类似如下的语句

--@XmlDocument是前台传入的xml 类型是 varchar(max)

EXEC sp_xml_preparedocument @DocHandle OUTPUT, @XmlDocument
insert into #XMLTable
SELECT * FROM OPENXML (@DocHandle, '/Roots/Base',2)
WITH (
f1 varchar(20),
f2 uniqueidentifier, 
f3  float,        
         ……
         ……
)

之所以能用 f1,f2,是因为XML里,在 /Roots/Base  下一层,就是各个f1,f2的定义。

但是现在前台的XML,其f1,f2变成了用户定义。
<root>
 <base>
  <aaa id="0", desc="aaa",xxxxxxxxx>
   <aa1 xxxxxx></aa1>
  </aaa>
  <bbb id="2",desc="bbb", xxxxx>
  </bbb>
……
……
   </base>
</root>
这里,aaa和bbb是任意的。每一层底下有几个子节点,也是任意的(类似aa1)。每一层的描述也是任意的,但是都有id和desc

现在要把这样的XML保存到一个表里,字段是 name,id,desc
改怎么写?
以上面的XML为例子,表里应该是
name id desc
aaa  0   aaa
bbb  2   bbb
  



------解决方案--------------------
参考例子:


DECLARE @XmlDocumentHandle int
DECLARE @XmlDocument nvarchar(4000)
SET @XmlDocument = N'<ROOT>
<Customer>
   <CustomerID>VINET</CustomerID>
   <ContactName>Paul Henriot</ContactName>
   <Order OrderID="10248" CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <OrderDetail ProductID="11" Quantity="12"/>
      <OrderDetail ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer>   
   <CustomerID>LILAS</CustomerID>
   <ContactName>Carlos Gonzlez</ContactName>
   <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">