SQL Server2005中使用XML-使用OPENXML将xml数据插入到数据库

摘要:
由于OPENXML是行集提供程序,因此可在会出现行集提供程序的Transact-SQL语句中使用OPENXML。通过调用sp_xml_preparedocument创建XML文档的内部表式形式。rowpatternXPath模式,用来标识要作为行处理的节点。2使用“以元素为中心”的映射。8可与XML_ATTRIBUTES或XML_ELEMENTS组合使用(逻辑或)。ColType行集中列的SQLServer数据类型。如果列类型不同于属性的基础xml数据类型,则将发生类型强制。ColPattern可选的通用XPath模式,它说明应如何将XML节点映射到列。MetaProperty由OPENXML提供的元属性之一。使用元属性可以提取有关XML节点的信息。

微软帮助文档地址:http://msdn.microsoft.com/zh-cn/library/ms186918.aspx

OPENXML 通过 XML 文档提供行集视图。由于 OPENXML 是行集提供程序,因此可在会出现行集提供程序(如表、视图或 OPENROWSET 函数)的 Transact-SQL 语句中使用 OPENXML。


OPENXML( idoc int [ in] , rowpattern nvarchar [ in ] , [ flags byte [ in ] ] )
[ WITH ( SchemaDeclaration | TableName ) ]
SQL Server2005中使用XML-使用OPENXML将xml数据插入到数据库第1张参数

idoc

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

rowpattern

XPath 模式,用来标识要作为行处理的节点(这些节点在 XML 文档中,该文档的句柄由idoc参数传递)。

flags

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

字节值

说明

0

默认为“以属性为中心”的映射。

1

使用“以属性为中心”的映射。可以与 XML_ELEMENTS 一起使用。这种情况下,首先应用“以属性为中心”的映射,然后对所有未处理的列应用“以元素为中心”的映射。

2

使用“以元素为中心”的映射。可以与 XML_ATTRIBUTES 一起使用。这种情况下,首先应用“以属性为中心”的映射,然后对所有未处理的列应用“以元素为中心”的映射。

8

可与 XML_ATTRIBUTES 或 XML_ELEMENTS 组合使用(逻辑或)。在检索的上下文中,该标志指示不应将已使用的数据复制到溢出属性@mp:xmltext

SchemaDeclaration

窗体的架构定义:ColNameColType[ColPattern|MetaProperty] [,ColNameColType[ColPattern|MetaProperty]...]

ColName

行集中的列名。

ColType

行集中列的 SQL Server 数据类型。如果列类型不同于属性的基础xml数据类型,则将发生类型强制。

ColPattern

可选的通用 XPath 模式,它说明应如何将 XML 节点映射到列。如果没有指定ColPattern,则发生默认映射(由flags指定的“以属性为中心”或“以元素为中心”的映射)。

指定为ColPattern的 XPath 模式用于指定特殊的映射性质(如果发生“以属性为中心”和“以元素为中心”的映射),这些特殊的映射性质可以重写或增强由flags所指示的默认映射。

指定为ColPattern的通用 XPath 模式也支持元属性。

MetaProperty

由 OPENXML 提供的元属性之一。如果指定MetaProperty,则该列包含元属性提供的信息。使用元属性可以提取有关 XML 节点的信息(如相对位置和命名空间信息)。它提供了比文本表示形式更详细的信息。

TableName

如果具有所需架构的表已经存在且不要求列模式,则为给定的表名(而不是SchemaDeclaration)。

DECLARE @doc xml
SET @doc = '<?xml version="1.0" ?>
<SalesOrder CustomerID="18759" DueDate="2006-01-01T00:00:00"
AccountNumber="10-4030-018759" ContactID="4189" BillToAddressID="14024" ShipToAddressID="14024" ShipMethodID="1" SubTotal="174.20" TaxAmt="10">
<Item>
<ProductID>714</ProductID>
<OrderQty>5</OrderQty>
<UnitPrice>28.84</UnitPrice>
</Item>
<Item>
<ProductID>715</ProductID>
<OrderQty>1</OrderQty>
<UnitPrice>30</UnitPrice>
</Item>
</SalesOrder>
'
DECLARE @docHandle int
--调用系统存储过程以创建内存树(sp_xml_preparedocument解析XML文档,在内存中形成一棵树,将树的根节点指针作为句柄传回;后面的程序,通过句柄进行操作。)
EXEC sp_xml_preparedocument @docHandle OUTPUT, @doc
-----------------------------------------------------------------------------INSERT [Sales].[SalesOrderHeader]
([CustomerID], [DueDate], [AccountNumber], [ContactID], [BillToAddressID],
[ShipToAddressID], [ShipMethodID], [SubTotal], [TaxAmt])
SELECT * FROM
--添加OPENXML 查询(返回一张表)插入数据到SalesOrderHeader 表OPENXML(@docHandle, '/SalesOrder', 1)
--访问/SalesOrder节点,0代表默认映射(属性),1代表节点的属性,2代表节点的文本,3代表属性和文本WITH --定义表的结构( CustomerID int,
DueDate datetime,
AccountNumber nvarchar(15),
ContactID int,
BillToAddressID int,
ShipToAddressID int,
ShipMethodID int,
SubTotal money,
TaxAmt money)
-----------------------------------------------------------------------------DECLARE @result int
--获取SalesOrderHeader插入的特性以使用在SalesOrderDetail插入中SET @result = SCOPE_IDENTITY()
INSERT INTO [Sales].[SalesOrderDetail]
([SalesOrderID], [OrderQty], [ProductID], [SpecialOfferID], [UnitPrice])
SELECT @result, [OrderQty], [ProductID], 1, [UnitPrice] FROM
--添加OPENXML 查询插入数据到SalesOrderDetail 表OPENXML(@docHandle, '/SalesOrder/Item', 2)
--访问/SalesOrder/Item节点,1代表节点的属性,2代表节点的文本WITH
( OrderQty int,
ProductID int,
UnitPrice money)
--调用存储过程以清除内存树EXEC sp_xml_removedocument @docHandle

免责声明:文章转载自《SQL Server2005中使用XML-使用OPENXML将xml数据插入到数据库》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#使用XML文件记录操作日志spring boot 访问页面(静态页面及jsp页面)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

简单对象访问协议(SOAP)初级指南[转]

这篇文章带你全面回顾对象远程进程调用(ORPC)技术的历程,以帮助你理解SOAP技术的基础,以及它克服存在技术(如CORBA和DCOM)的许多缺陷的方法。随后讲述详细的SOAP编码规则,并把焦点放在SOAP是怎样映射到存在的ORPC概念上的。   引言:   当我在1984年开始把计算作为我的职业的时候,大多数程序员并不关心网络协议。但是在九十年代网络变得...

操作系统开发:启用内存分页机制

该系列文章是在学习《操作系统真相还原》时通过阅读后简化并适当描述整理的学习笔记,首先,致敬作者郑刚博士,在读本书时能深刻的感觉到作者写书时一丝不苟的态度,书很厚写的,讲解细致幽默,很能让人愿意继续读下去,同时也不得不佩服作者计算机底层功力的深厚。 本文章只是学习笔记,并非原创作品,你可以任意转载,请保留原作者(郑刚)版权信息。 目前我们已进入保护模式,但依...

XML WebService实例详细解析

先,我们必须了解什么是webservice.就概念上来说,可能比较复杂,不过我们可以有个宏观的了解:webservice就是个对外的接口,里面有 函数可供外部客户调用(注意:里面同样有客户不可调用的函数).假若我们是服务端,我们写好了个webservice,然后把它给了客户(同时我们给了他 们调用规则),客户就可以在从服务端获取信息时处于一个相对透明的状态...

Qt之log数据展示模块简要实现

Log模块主要用于实时测井数据的显示和测后曲线数据的预览和打印,为更好的展示对Qt中相关知识点的应用,特以Log模块为例对其进行简要实现。 内容导图: 一、功能需求 1、界面效果图 Log模块实现曲线数据的显示及相关属性(曲线颜色、画笔类型、画笔宽度等)的设置 将上图划分为三个区域:右边为轨道信息显示和管理区,可以参看和设置相关轨道信息 左上为轨道的L...

Android 三种动画详解

Android 三种动画详解 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今天来一发Android应用的各种Animation大集合。英文厉害的请直接移步参考Android Developer。 Android系统提供了很多丰富的API去实现UI的2D与3D动画,最主要的划分可以分为如...

C# 序列化与反序列化Serialization之Json Xml Binary Soap JavaScript序列化

所谓的序列化其实就是把一个内存中的对象信息转化成一个可以持久化保存的形式,方便保存数据库和文件或着用于传输, 序列化的主要作用是不同平台之间进行通信与信息的传递保存等,常用的有序列化有Json Xml Binary Soap JavaScript序列化等,当然我们也可以使用第三方的序列化类库,第三方的序列化类库可以参照网上的,这里不再赘述, 本文主要介绍J...