zoukankan      html  css  js  c++  java
  • Sql 解析XML 解决方案

     

    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

  • 相关阅读:
    SSH through HTTP proxy
    聊聊主流框架,Less/Sass/Compass/Bootstrap/H5bp » 社区 | Ruby China
    HTTP Tunneling (HTTP Proxy Socket Client)
    现代 C++ 编程指南
    用C++实现HTTP服务器 Windows平台(开放源代码) Que's C++ Studio 博客频道 CSDN.NET
    nvie/rq
    第二章 C语言实例 —制作http服务器 dennis ITeye技术网站
    GNU libmicrohttpd: a library for creating an embedded HTTP server
    Design Patterns and Refactoring
    A LinuxJunky Blog: A Very Simple HTTP Server writen in C
  • 原文地址:https://www.cnblogs.com/zoood/p/4914598.html
Copyright © 2011-2022 走看看