zoukankan      html  css  js  c++  java
  • 【转】SQL2005对XML的处理

    1、记录到XML变量
    declare @cxml xml
    set @cxml=(select * from zd_storeP for XML RAW('store'),ROOT('stores'))
    select @cxml
    2、XML到记录集
      方法一:用OPENXML  90000条记录速度测试,22s,16s,16s
    declare @cxml xml,@nxml int
    set @cxml=(select * from zd_storeP for XML RAW('store'),ROOT('stores')) --大概1s
    select @cxml
    exec sp_xml_preparedocument @nxml OUTPUT, @cxml  --大概3-4s
    select ls.* from openxml(@nxml,'/stores/store') with (nID INT,cName VARCHAR(20)) as ls
      方法二:用XML的nodes属性  90000条记录速度测试,8s,8s,8s
    declare @cxml xml
    set @cxml=(select * from zd_storeP for XML RAW,ROOT) --默认ROOT为root,RAW为row
    select ls.row.value('@nID[1]','INT') as nID,ls.row.value('@cName[1]','varchar(50)') as cName
    from @cxml.nodes('/root/row') as ls(row)
    3、SQL2005存储过程中,传入XML参数
      方法一:对应上面的一
    CREATE PROCEDURE [dbo].[testxml1]
      @cxml xml
    AS
    BEGIN
      SET NOCOUNT ON;
      declare @nxml int
      exec sp_xml_preparedocument @nxml OUTPUT, @cxml 
      select ls.* from openxml(@nxml,'/VFPData/row') with (nid INT,cname VARCHAR(50)) as ls
    END
      方法二:对应上面的二
    create PROCEDURE [dbo].[testxml2]
      @cxml xml
    AS
    BEGIN
      SET NOCOUNT ON;
      select ls.row.value('@nid[1]','INT') as nID,ls.row.value('@cname[1]','varchar(50)') as cName
        from @cxml.nodes('/VFPData/row') as ls(row)
    END
    注意:如果XML是VFP的CursorToXML生成的,需要注意:
      (1)with (nid INT,cname VARCHAR(50)) 括号中列名必须用小写,因为CursorToXML生成的XML格式字段强制了小写;
      (2)VFP中,CursorToXML("cursor1","lcCxml",3,16) 最后的参数必须用16,表示采用游标的代码页,否则乱码了。
    下面的例子,阐述了另一种语法,它能够在XML变量中直接立即更新表。
      1 CREATE PROCEDURE [dbo].[UpdateInventory2]
      2 (
      3    @x XML
      4 )
      5 AS
      6 
      7 SET NOCOUNT ON
      8 
      9 /*
      10    This version of the stored procedure has a slightly enhanced version of the
      11    TSQL code. This version updates the table directly from the XML variable,
      12    rather than converting the XML data to a view. 
      13 */
      14 
      15 UPDATE Inventory SET
      16    stock = stock + x.item.value('@Qty[1]','INT')
      17 FROM Inventory inv
      18 INNER JOIN @x.nodes('//items/item') x(item) ON
      19    (x.item.value('@ItemNumber[1]','varchar(20)') = inv.ItemNumber)
      20 
      21 RETURN
    4、SQL2005存储过程返回XML,在VFP中XMLToCursor()
    -- =============================================
    -- Author:<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:<测试返回XML变量,然后在VFP中还原游标>
    -- =============================================
    alter PROCEDURE testxml3
      @cxml varchar(max) output
    AS
    BEGIN
    SET NOCOUNT ON;
        declare @cxml2 xml
        set @cxml2=(select * from zd_storeP for XML RAW('row'),ROOT('VFPData'))
        set @cxml=cast(@cxml2 as varchar(max))
        return
    END
    注意:output参数不能为xml类型,而要为varchar类型,否则VFP的XMLToCursor会报错的。
     
  • 相关阅读:
    同步/异步/阻塞/非阻塞
    java io异步
    java nio知识点总结
    使用BBED恢复数据文件头
    Codeforces Round #257 (Div. 2) B Jzzhu and Sequences
    Hibernate @Embeddable注解
    2388 Who&#39;s in the Middle(简单排序)
    CorePlot学习
    九度OJ 1179 阶乘(模拟)
    NSHashTable 和 NSMapTable学习
  • 原文地址:https://www.cnblogs.com/luofuxian/p/2279238.html
Copyright © 2011-2022 走看看