MSSQL 处理xml

详细可参阅:示例:使用 OPENXML - SQL Server | Microsoft Docshttps://docs.microsoft.com/zh-cn/sql/relational-databases/xml/examples-using-openxml?view=sql-server-ver16

OPENXML 

OPENXML( idoc int [ in] , rowpattern nvarchar [ in ] , [ flags byte [ in ] ] ) [ WITH ( SchemaDeclaration | TableName ) ]

idoc
XML 文档的内部表式形式的文档句柄。 通过调用 sp_xml_preparedocument 创建 XML 文档的内部表式形式。

rowpattern
XPath 模式,用于标识要作为行处理的节点。 节点来自在 idoc 参数中传递句柄的 XML 文档。

flag
指明在 XML 数据和关系行集间使用的映射,以及如何填充溢出列。 flag 为可选输入参数,可以是下列值之一。

字节值描述
0默认为“以属性为中心”的映射。
1使用“以属性为中心”的映射。 可以与 XML_ELEMENTS 一起使用。 在这种情况下,“以属性为中心”映射先应用。 接下来,对任何剩余列应用“以元素为中心”映射。
2使用“以元素为中心”的映射。 可以与 XML_ATTRIBUTES 一起使用。 在这种情况下,“以属性为中心”映射先应用。 接下来,对任何剩余列应用“以元素为中心”映射。
8可与 XML_ATTRIBUTES 或 XML_ELEMENTS 组合使用(逻辑或)。 在检索上下文中,此标志指明不得将已用数据复制到溢出属性 @mp:xmltext

例 1(可从官网查阅更多例子):

DECLARE @xml VARCHAR(MAX);
 
DECLARE @iDOM INT,
        @iret INT;

SET @xml
    = '<?xml version="1.0" encoding="gb2312"?>
<root>
  <le>
    <RecordID>1</RecordID>
    <A1>计算机中心</A1>
    <A2>210800468</A2>
  </le>
</root>';
EXEC @iret = sp_xml_preparedocument @iDOM OUTPUT, @xml;
IF @iret > 0
BEGIN
    EXEC sp_xml_removedocument @iDOM;
END;

IF OBJECT_ID('tempdb..#A') IS NOT NULL
    DROP TABLE #A;

SELECT *
INTO #A
FROM
    OPENXML(@iDOM, '/root/le', 2)
    WITH
    (
        RecordID INT,
         A1 VARCHAR(100),
        A2 VARCHAR(100)
    );

--下面是分析主数据 。

EXEC sp_xml_removedocument @iDOM;

SELECT *
FROM #A;

IF OBJECT_ID('tempdb..#A') IS NOT NULL
    DROP TABLE #A;

结果:

例2:

DECLARE @idoc INT, @doc VARCHAR(1000);   
SET @doc ='  
<ROOT>  
<Customer CustomerID="VINET" ContactName="Paul Henriot">  
   <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" ContactName="Carlos Gonzlez">  
   <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"   
           OrderDate="1996-08-16T00:00:00">  
      <OrderDetail ProductID="72" Quantity="3"/>  
   </Order>  
</Customer>  
</ROOT>';   
  
--Create an internal representation of the XML document.  
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;   
  
-- SELECT stmt using OPENXML rowset provider  
SELECT *  
FROM   OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)   
         WITH (OrderID       int         '../@OrderID',
               CustomerID  varchar(10) '../@CustomerID',
               OrderDate   datetime    '../@OrderDate',
               ProdID      int         '@ProductID',
               Qty         int         '@Quantity');

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lypingfan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值