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. Nuxt|Vue仿探探/陌陌卡片式滑动|vue仿Tinder拖拽翻牌效果

    探探/Tinder是一个很火的陌生人社交App,趁着国庆假期闲暇时间倒腾了个Nuxt.js项目,项目中有个模块模仿探探滑动切换界面效果.支持左右拖拽滑动like和no like及滑动回弹效果. 一览效 ...

  2. 收集的照片信息都是Excel超链接?批量命名很困难?来试试这个自制的下载器吧!

    项目背景 作为大学的一名班委,经常要制作各种表格.统计各种信息,成为一名合格的"表哥"是一门必修课.其实Excel的文字信息和数字信息的统计和处理还并不算难题,很多信息可以通过问卷 ...

  3. (OK) Android内核(4.9)集成最新版MPTCP---成功

    Android内核(4.9)集成最新版MPTCP---成功

  4. linq 整理(前序)

    前言 对linq进行整理,分为前序.中序和后序. 前序就是一些简单的概念和模拟. 中序的话就是深挖一些思想. 后序对其进行解刨. 正文 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# ...

  5. MeteoInfoLab脚本示例:TOMS HDF数据

    TOMS (Total Ozone Mapping Spectrometer)数据是全球臭氧观测.脚本程序: #Add data file folder = 'D:/Temp/hdf/' fns = ...

  6. 99%的Android开发不得不面对的三道坎,到底该怎么破?

    今年比往年要特殊一些,受疫情的影响,很多公司都出现了裁员现象.以至于最近很多技术同学也在纷纷向我倒苦水. 王鹏便是其中的一员,王鹏之前是在一线城市的一家小型互联网公司做Android应用开发.从毕业实 ...

  7. day43 Pyhton 并发编程06

    一.内容回顾 线程 锁 为什么有了GIL之后还需要锁 多个线程同时操作全局变量还需要锁 当出现'非原子性操作',例如+= -= *= /= l.append(l) 原子性操作 a += 1  a= a ...

  8. Jmeter请求之cookie处理方式

    方法一:增加cookie管理器线程组->配置元件->HTTP Cookie管理器,放在最上方 但该方法不一定有效 方法二:http信息头&正则表达式提取器结合使用, 在登录的htt ...

  9. Flink on Yarn三部曲之一:准备工作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. Github上的沙雕项目,玩100遍都不够

    这段时间大家在家自我隔离.居家办公憋坏了吧.为了打发这种无聊的生活,我决定拿出我在github上珍藏多年的沙雕项目,让大家在无聊的时候可以打发时间. Github作为互联网上最大的开源社区,一直备受程 ...