是这样的,一张表中有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>
问一下各位高手,这样的存储过程要怎么写,不会要用两个游标来循环吗?
数据量挺大,如何写才能高效呀?
现在要取出表的记录,生成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>
问一下各位高手,这样的存储过程要怎么写,不会要用两个游标来循环吗?
数据量挺大,如何写才能高效呀?
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
<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>
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是我为了写语句方便所以临时写的. 如果你不怕麻烦,也可以套用子查询一条语句完成功能.
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