是这样的,一张表中有Id,类别字段、产品名称字段
现在要取出表的记录,生成xml文件,要求如下:
先SELECT  type FROM product  GROUP BY type
循环取出每个type写个xml节点<type name=类别名称>
再根据类别名称取最新的10条记录
select Id,name from product where type=类别名称
再循环写xml节点<product name=产品名称 pid=产品ID></product>
结束时再封闭type节点</type>
问一下各位高手,这样的存储过程要怎么写,不会要用两个游标来循环吗?
数据量挺大,如何写才能高效呀?

解决方案 »

  1.   

    --创建表
    CREATE TABLE product(id CHAR(2),type VARCHAR(10),name VARCHAR(30))
    INSERT INTO product SELECT '01','TYPE1','PRODUCTNAME1'
    UNION ALL SELECT '02','TYPE2','PRODUCTNAME2'
    UNION ALL SELECT '03','TYPE1','PRODUCTNAME3'
    UNION ALL SELECT '04','TYPE1','PRODUCTNAME4'
    UNION ALL SELECT '05','TYPE2','PRODUCTNAME5'
    UNION ALL SELECT '06','TYPE1','PRODUCTNAME6'
    UNION ALL SELECT '07','TYPE3','PRODUCTNAME7'
    UNION ALL SELECT '08','TYPE3','PRODUCTNAME8'
    UNION ALL SELECT '09','TYPE2','PRODUCTNAME9'
    UNION ALL SELECT '10','TYPE1','PRODUCTNAME10'
    UNION ALL SELECT '11','TYPE3','PRODUCTNAME11'
    GO
    --声明游标(外层)
    DECLARE T_CURSOR CURSOR
    FOR
    SELECT type FROM product GROUP BY type
    --打开外层游标
    OPEN T_CURSOR
    DECLARE @product_type VARCHAR(10)--声明变量,用于保存产品类型type
    FETCH T_Cursor INTO @product_type
    WHILE @@FETCH_STATUS=0
    BEGIN
    PRINT '<type name="'+@product_type+'">'
    ---------------------------------------------------------------
    --------声明游标(内层)
    DECLARE P_CURSOR CURSOR
    FOR
    SELECT TOP 10 id,name from product WHERE type=@product_type
    --------打开内层游标
    OPEN P_CURSOR
    DECLARE @product_id CHAR(2),@product_name VARCHAR(30)--声明变量,用于保存产品id和产品名称name
    FETCH P_Cursor INTO @product_id,@product_name
    WHILE @@FETCH_STATUS=0
    BEGIN
    PRINT ' <product pid="'+@product_id+'" name="'+@product_name+'"></product>'
    FETCH P_Cursor INTO @product_id,@product_name
    END
    --------关闭内层游标
    CLOSE P_Cursor
    DEALLOCATE P_Cursor
    ---------------------------------------------------------------
    PRINT '</type>'
    FETCH T_Cursor INTO @product_type
    END
    --关闭外层游标
    CLOSE T_Cursor
    DEALLOCATE T_Cursor
    --删除表
    DROP TABLE product
      

  2.   

    生成结果:
    <type name="TYPE1">
    <product pid="01" name="PRODUCTNAME1"></product>
    <product pid="03" name="PRODUCTNAME3"></product>
    <product pid="04" name="PRODUCTNAME4"></product>
    <product pid="06" name="PRODUCTNAME6"></product>
    <product pid="10" name="PRODUCTNAME10"></product>
    </type>
    <type name="TYPE2">
    <product pid="02" name="PRODUCTNAME2"></product>
    <product pid="05" name="PRODUCTNAME5"></product>
    <product pid="09" name="PRODUCTNAME9"></product>
    </type>
    <type name="TYPE3">
    <product pid="07" name="PRODUCTNAME7"></product>
    <product pid="08" name="PRODUCTNAME8"></product>
    <product pid="11" name="PRODUCTNAME11"></product>
    </type>
      

  3.   

    不需要使用循环,用 FOR XML子句即可.CREATE TABLE product(id CHAR(2),type VARCHAR(10),name VARCHAR(30))
    INSERT INTO product SELECT '01','TYPE1','PRODUCTNAME1'
    UNION ALL SELECT '02','TYPE2','PRODUCTNAME2'
    UNION ALL SELECT '03','TYPE1','PRODUCTNAME3'
    UNION ALL SELECT '04','TYPE1','PRODUCTNAME4'
    UNION ALL SELECT '05','TYPE2','PRODUCTNAME5'
    UNION ALL SELECT '06','TYPE1','PRODUCTNAME6'
    UNION ALL SELECT '07','TYPE3','PRODUCTNAME7'
    UNION ALL SELECT '08','TYPE3','PRODUCTNAME8'
    UNION ALL SELECT '09','TYPE2','PRODUCTNAME9'
    UNION ALL SELECT '10','TYPE1','PRODUCTNAME10'
    UNION ALL SELECT '11','TYPE3','PRODUCTNAME11'SELECT DISTINCT type INTO tab FROM product
    SELECT   1 AS Tag,
     NULL AS Parent,
     type as [type!1!name],
     null as [product!2!pid],
     NULL AS [product!2!name]
    FROM tab
    UNION ALL
    SELECT   2,
     1,
     type,
     id,
     name
    FROM product
    ORDER BY [type!1!name]
    FOR XML EXPLICIT
    DROP TABLE product,tab表 tab是我为了写语句方便所以临时写的. 如果你不怕麻烦,也可以套用子查询一条语句完成功能.
      

  4.   

    fcuandy(手中无剑,心中亦无) ( ) 真是高手,谢谢了不过好象取出的记录不是每个类别的最新的10条记录
      

  5.   

    CREATE TABLE product(id CHAR(2),type VARCHAR(10),name VARCHAR(30))
    INSERT INTO product SELECT '01','TYPE1','p1'
    UNION ALL SELECT '02','TYPE2','p2'
    UNION ALL SELECT '03','TYPE1','P3'
    UNION ALL SELECT '04','TYPE1','P4'
    UNION ALL SELECT '05','TYPE2','P5'
    UNION ALL SELECT '06','TYPE1','P6'
    UNION ALL SELECT '07','TYPE3','P7'
    UNION ALL SELECT '08','TYPE3','P8'
    UNION ALL SELECT '09','TYPE2','P9'
    UNION ALL SELECT '10','TYPE1','P10'
    UNION ALL SELECT '11','TYPE3','P11'SELECT DISTINCT type INTO tab FROM productSELECT * INTO p1 FROM product b WHERE 3>(SELECT COUNT(1) FROM product c WHERE c.id>b.id AND c.type=b.type) ORDER BY TypeSELECT   1 AS Tag,
     NULL AS Parent,
     type as [type!1!name],
     null as [product!2!pid],
     NULL AS [product!2!name]
    FROM tab
    UNION ALL
    SELECT   2,
     1,
     type,
     id,
     name
    FROM p1
    ORDER BY [type!1!name],[product!2!pid]
    FOR XML EXPLICITDROP TABLE product,tab,p1
      

  6.   

    提醒楼主,如果是用ADO取得结果集,按照fcuandy(手中无剑,心中亦无) 的写法可能和普通的取法不一样,lz注意一下。