Sql 解析XML 解决方案
- 1. 1、@XML 为数据传入的XML格式
- 2. root 为根目录
- 3. <A>为对应需要插入的表,详见一对多或者多对多的xml格式
- 4. 多对多是<ID> 为该条数据对应的从表的唯一标识,可以为其他名称的字段。
如:<Customer><ID>1</ID></ Customer >
<CustomerBranch><ID>1</ID></CustomerBranch>
- 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 解决方案的更多相关文章
- Sql 解析XML 解决方案参考
1.定义存储过程 -- =============================================-- Author: <Author,,Name>-- Create da ...
- sql解析xml
我们有时候需要在sql中解析xml,xml解析sql实例如下: DECLARE @params xml DECLARE @customparams xml = null -- 0.解析输入参数 ...
- SQL解析XML文件
DECLARE @idoc int DECLARE @doc varchar(max) SET @doc ='<?xml version="1.0" encoding=&qu ...
- SQL 存储过程 解析XML
第一种说明: 我看过这样一篇文章,如下 在SQL Server2005中,微软延续了 2000中一个特性(即支持XML类型的数据),并加强了对XML 数据列.XML变量以及XML索引的支持 ...
- SQL Server XML数据解析
--5.读取XML --下面为多种方法从XML中读取EMAIL DECLARE @x XML SELECT @x = ' <People> <dongsheng> <In ...
- SQL Server解析XML数据的方法详解
--下面为多种方法从XML中读取EMAIL DECLARE @x XML SELECT @x = ' <People> <dongsheng> <Info Name=&q ...
- Oracle使用Sql把XML解析成表(Table)的方法
SELECT * FROM XMLTABLE('$B/DEAL_BASIC/USER_DEAL_INFO' PASSING XMLTYPE('<?xml version="1.0&qu ...
- 《Mybatis 手撸专栏》第9章:细化XML语句构建器,完善静态SQL解析
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你只是在解释过程,而他是在阐述高度! 如果不是长时间的沉淀.积累和储备,我一定也没有 ...
- Objective-C ,ios,iphone开发基础:使用GDataXML解析XML文档,(libxml/tree.h not found 错误解决方案)
使用GDataXML解析XML文档 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用第三方的库,原因是解析效率更高.使用上更方便 这里主要介绍一下 ...
随机推荐
- Java基础系列-RandomAccess
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755424.html Random是随机的意思,Access是访问的意思,合起来就是随机访问的意思. ...
- 如何快速构建React组件库
前言 俗话说:"麻雀虽小,五脏俱全",搭建一个组件库,知之非难,行之不易,涉及到的技术方方面面,犹如海面风平浪静,实则暗礁险滩,处处惊险- 目前团队内已经有较为成熟的 Vue 技术 ...
- 正式班D8
2020.10.15星期四 正式班D8 一.上节课复习 OSI七层协议 socket socket是对传输层以下的封装 IP+port标识唯一一个基于网络通讯的软件 TCP与UDP TCP:因为在通信 ...
- chrome(谷歌)登录失败解决方案
相信有很多小伙伴和我一样,同步chrome的收藏夹,这样也便于随时可以查看自己收藏的网址.但是同步文件,必须先要登录chrome账号,登录chrome账号时,总是会报黄页,或者一直加载不出来.接下来, ...
- 【Linux教程】Linux系统零基础编程入门,想当大神?这些你都要学
✍ 文件和文件系统 文件是Linux系统中最重要的抽象,大多数情况下你可以把linux系统中的任何东西都理解为文件,很多的交互操作其实都是通过文件的读写来实现的. 文件描述符 在Linux内核中,文件 ...
- C/C++编程日记:用C语言实现的简单Web服务器(Linux),全代码分享!
相信大家对Apache都有所听闻,Apache是目前使用最为广泛我Web服务器.大家可以从news.netcraft.com/这个网站得到证实. 这是腾讯的uptime.netcraft.com/up ...
- 【树形DP】ZJOI2008 骑士
题目内容 洛谷链接 有\(n\)位骑士,每个人的战力可能不同,并且每一个人都有且仅有一个憎恨的人,互相憎恨的人不能在同一队中. 求组合为一个骑士队的最大战斗力. PS:可以去看看题目背景学学历史(雾) ...
- BERT模型详解
1 简介 BERT全称Bidirectional Enoceder Representations from Transformers,即双向的Transformers的Encoder.是谷歌于201 ...
- Codeforces Round #427 (Div. 2) E. The penguin's game (交互题,二进制分组)
E. The penguin's game time limit per test: 1 second memory limit per test: 256 megabytes input: stan ...
- update不能直接使用select的返回结果
update不能直接使用select的返回结果,这是会报错的,这是SQL的语法规定的,若想在update中与select结合使用,sql需要这样写: 1.其中field1,field2为表中的字段名 ...