1. 1.         1、@XML 为数据传入的XML格式
  2. 2.         root 为根目录
  3. 3.         <A>为对应需要插入的表,详见一对多或者多对多的xml格式
  4. 4.         多对多是<ID> 为该条数据对应的从表的唯一标识,可以为其他名称的字段。

如:<Customer><ID>1</ID></ Customer >

<CustomerBranch><ID>1</ID></CustomerBranch>

  1. 5.         注意案例存储过程只定义了2个参数,可以根据自己的具体需求增加参数。

1.6  EXECUTE sp_xml_preparedocument 为sql自带的处理xml函数。

一、         对单表(单条或者多条)的操作。

declare @XML xml

set @XML=N'<root>

<A>

<ID>1</ID>

<name>test1</name>

</A>

<A>

<ID>2</ID>

<name>test2</name>

</A>

</root>'

Insert into Temp(ID,Name)

select S.value('(ID)[1]','int') as ID,

S.value('(name)[1]','nvarchar') as name,

from @ XML.nodes('/root/A')  T(S)

注意:A 为表名 ID,Name为此表对应的字段名

二、         对多表(一对多)的操作

declare @CustomerID int

declare @XML xml

set @XML=N'<root>

<Customer>

<CustomerName>深圳大展</CustomerName>

<CustomerTypeID>116</CustomerTypeID>

</Customer>

<CustomerBranch>

<BranchID>2</BranchID>

<AreaID>6</AreaID>

</CustomerBranch>

<CustomerBranch>

<BranchID>2</BranchID>

<AreaID>6</AreaID>

</CustomerBranch>

</root>'

Insert into Customer(CustomerName,CustomerTypeID)

select S.value('(CustomerName)[1]','nvarchar') as CustomerName,

S.value('(CustomerTypeID)[1]','int') as CustomerTypeID

from @XML.nodes('/root/Customer')  T(S)

set @CustomerID =@@IDENTITY

insert into CustomerBranch(CustomerID,AreaID,BranchID)

select @CustomerID , S.value('(AreaID)[1]','int') as AreaID,

S.value('(BranchID)[1]','int') as BranchID

from @XML.nodes('/root/CustomerBranch')  T(S)

三、         对多表(多对多)的操作

 

declare @CustomerID int

declare @Count int

declare @Error int

declare @XML xml

set @XML=N'<root>

<Customer>

<ID>1</ID>

<CustomerName>深圳大展</CustomerName>

<CustomerTypeID>116</CustomerTypeID>

</Customer>

<Customer>

<ID>2</ID>

<CustomerName>艾默生</CustomerName>

<CustomerTypeID>116</CustomerTypeID>

</Customer>

<CustomerBranch>

<ID>1</ID>

<BranchID>2</BranchID>

<AreaID>6</AreaID>

</CustomerBranch>

<CustomerBranch>

<ID>2</ID>

<BranchID>4</BranchID>

<AreaID>6</AreaID>

</CustomerBranch>

<CustomerBranch>

<ID>2</ID>

<BranchID>2</BranchID>

<AreaID>3</AreaID>

</CustomerBranch>

</root>'

select @Count =MAX(RowNumber)

from ( select ROW_NUMBER() OVER (ORDER BY S.value('(ID)[1]','int') ) AS RowNumber

from  @XML.nodes('/root/Customer')  T(S)) as m

while(@Count>0)

begin

insert into Customer(CustomerName,CustomerTypeID)

select CustomerName,CustomerTypeID

from (

select ROW_NUMBER() OVER (ORDER BY  S.value('(ID)[1]','int') desc ) ASRowNumber,

S.value('(CustomerName)[1]','nvarchar(200)') as CustomerName,

S.value('(CustomerTypeID)[1]','int') as CustomerTypeID

from @XML.nodes('/root/Customer')  T(S)

) as m  where RowNumber=@Count

set @CustomerID=@@IDENTITY

insert into CustomerBranch(CustomerID,AreaID,BranchID)

select @CustomerID , S.value('(AreaID)[1]','int') as AreaID,

S.value('(BranchID)[1]','int') as BranchID

from @XML.nodes('/root/CustomerBranch')  T(S)

where S.value('(ID)[1]','int') =( select ID

from ( select ROW_NUMBER()OVER (ORDER BY  S.value('(ID)[1]','int') desc ) AS RowNumber,

S.value('(ID)[1]','int') as ID

from@XML.nodes('/root/Customer')  T(S)

) as m whereRowNumber=@Count)

set @Count=@Count-1

end

四、         批量更新数据

                declare @XML xml

set @XML=N'<root>

<Customer>

<CustomerID>1</CustomerID>

<CustomerName>大客户_TestXML2</CustomerName>

</Customer>

<Customer>

<CustomerID>2</CustomerID>

<CustomerName>大客户_TestXML1</CustomerName>

</Customer>

</root>'

update Customer

set CustomerName =m.value('(CustomerName)[1]','nvarchar(200)')

from @XML.nodes('/root/Customer') T(m)

where CustomerID=m.value('(CustomerID)[1]','int')

五、具体存储过程案例(一对多或者多对多的根据案例代码放入到对应的事务即可)

--测试存储过程

ALTER PROCEDURE [dbo].[AddXML]

(

@xmlstr XML,

@ProcMessageCode int output

)

AS

BEGIN

set nocount on

set xact_abort on

--定义中间变量

declare @error int

--设置初始值

set @error = 0

--开始事务处理

begin tran tranAddXML

insert into tt

select

S.value('(ID)[1]','int') as ID,

S.value('(name)[1]','nvarchar(10)') as name,

S.value('(age)[1]','int') as age

from @xmlstr.nodes('/root/tt') T(S)

--记录错误

set @error = @error + @@ERROR

if @error <> 0

begin

--回滚事务

rollback tran tranAddXML

--返回保存失败

set @ProcMessageCode = '10020115'

end

else

begin

--提交事务

commit tran tranAddXML

--返回保存成功

set @ProcMessageCode = '10030114'

end

set xact_abort off

set nocount off

END

Sql 解析XML 解决方案的更多相关文章

  1. Sql 解析XML 解决方案参考

    1.定义存储过程 -- =============================================-- Author: <Author,,Name>-- Create da ...

  2. sql解析xml

    我们有时候需要在sql中解析xml,xml解析sql实例如下:  DECLARE @params xml  DECLARE @customparams xml = null  -- 0.解析输入参数 ...

  3. SQL解析XML文件

    DECLARE @idoc int DECLARE @doc varchar(max) SET @doc ='<?xml version="1.0" encoding=&qu ...

  4. SQL 存储过程 解析XML

    第一种说明: 我看过这样一篇文章,如下 在SQL   Server2005中,微软延续了   2000中一个特性(即支持XML类型的数据),并加强了对XML   数据列.XML变量以及XML索引的支持 ...

  5. SQL Server XML数据解析

    --5.读取XML --下面为多种方法从XML中读取EMAIL DECLARE @x XML SELECT @x = ' <People> <dongsheng> <In ...

  6. SQL Server解析XML数据的方法详解

    --下面为多种方法从XML中读取EMAIL DECLARE @x XML SELECT @x = ' <People> <dongsheng> <Info Name=&q ...

  7. Oracle使用Sql把XML解析成表(Table)的方法

    SELECT * FROM XMLTABLE('$B/DEAL_BASIC/USER_DEAL_INFO' PASSING XMLTYPE('<?xml version="1.0&qu ...

  8. 《Mybatis 手撸专栏》第9章:细化XML语句构建器,完善静态SQL解析

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你只是在解释过程,而他是在阐述高度! 如果不是长时间的沉淀.积累和储备,我一定也没有 ...

  9. Objective-C ,ios,iphone开发基础:使用GDataXML解析XML文档,(libxml/tree.h not found 错误解决方案)

    使用GDataXML解析XML文档 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用第三方的库,原因是解析效率更高.使用上更方便 这里主要介绍一下 ...

随机推荐

  1. LCD显示器缺陷自动化检测方案

    很牛的测试 参考: 1.https://www.radiantvisionsystems.com/ 2.https://www.radiantvisionsystems.com/node/275 LC ...

  2. selenium3+python3自动化环境搭建

    (我也是小白,刚开始接触自动化,以下内容是我自己在配置环境的时候遇到的问题及解决方法,是后面才记录的要是有什么遗漏或者问题,欢迎帮忙指出来.)1.1首先下载python下载网址:https://www ...

  3. install Wine + WeChat in Fedora 31

    install Wine + WeChat in Fedora 31 dnf -y install dnf-plugins-core dnf config-manager --add-repo htt ...

  4. (SpringBoot-Jpa)使用Idea数据库自动脚本Generate POJOS生成 Entity对象,

    因:使用SpringBoot -jpa,需要手动配置Entity 但是如果你的表中有很多属性,或者有很多表怎么办?? 每个手动写? 还是用mybatis.写mapper??? 解决:使用idea自动工 ...

  5. 多测师讲解自动化 _邮件发送_高级讲师肖sir

    第一步.进入如下网址申请163邮箱. https://mail.163.com/ 第二步.注册完之后登录.点击如下图设置­点击POP3/SMTP/IMAP. 第三步.右侧点击客户端授权密码. 第四步. ...

  6. day28 Pyhton 面向对象 继承

    1.昨日回顾 类的命名空间 静态属性\动态属性(方法) 对象的命名空间 #对象的属性 #类指针:对象能够通过这个类指针找到类 #静态属性:属于类,多个对象共享这个资源 #尽量用类名来操作静态属性 #对 ...

  7. 测试-python相关

    python基础 一行代码实现1~100累加,不使用for循环 方式一: sum(range(1,101)) 方式二: 1 from functools import reduce 2 reduce( ...

  8. Drone 安装教程

    Drone 安装教程 一. CentOS设置 1. 更换阿里源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/ ...

  9. D - 活动选择

    Description 学校的大学生艺术中心周日将面向全校各个学院的学生社团开放,但活动中心同时只能供一个社团活动使用,并且每一个社团活动开始后都不能中断.现在各个社团都提交了他们使用该中心的活动计划 ...

  10. springboot入门系列(四):SpringBoot和Mybatis配置多数据源连接多个数据库

    SpringBoot和Mybatis配置多数据源连接多个数据库 目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑.在SpringBo ...