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会报错的。
  • 相关阅读:
    快速幂
    快速幂
    快速排序的分治求解方法
    快速排序的分治求解方法
    合并排序的分治求解方法
    合并排序的分治求解方法
    重写ListView解决ListView内部ViewPaper滑动事件冲突问题
    HDU 4970(杭电多校#9 1011题)Killing Monsters(瞎搞)
    Java 反射机制[Field反射]
    【公告】博客数据异常已所有恢复
  • 原文地址:https://www.cnblogs.com/luofuxian/p/2377441.html
Copyright © 2011-2022 走看看