存儲過程生成XML2級菜單

在SQL2000裏要生成符合自己要求格式的XML可不大容易,和同事找了很多資料,終於實現了利用SQL2000存儲過程生成2級菜單的XML文件。
以下是要實現的XML文件格式:
<?xml version="1.0" encoding="utf-16"?>    
<root>
<bigsort anclassid="62" name="旅行與休閒" ename="Travel & Leisure">
<ssort id="571" name="箱包" ename="Luggage & Bags">箱包 </ssort>
<ssort id="573" name="旅行配件" ename="Travel Accessories">旅行配件 </ssort>
</bigsort>
<bigsort anclassid="63" name="時尚生活" ename="Lifestyle">
<ssort id="578" name="手錶" ename="Watches">手錶 </ssort>
<ssort id="671" name="珠寶首飾" ename="Jewellery">珠寶首飾 </ssort>
</bigsort>
</root>
以下是存儲過程:
CREATE PROCEDURE dbo.classes_xml
AS
DECLARE @anclassid nvarchar(50),@anclass nvarchar(50),@nclassid nvarchar(50),@nclass nvarchar(50),@xmlclass nvarchar(4000),@anclass_en nvarchar(50),@count int,@ename nvarchar(50),@ename1 nvarchar(50),@nclass_en nvarchar(50),@count1 int
DECLARE     @ptrval binary(16)
create table ##xmltb(xmlclass ntext)
insert into ##xmltb (xmlclass)values('<?xml version="1.0" encoding="utf-16"?> '+char(13)+char(10)+'<root>'+char(13)+char(10))
DECLARE @cur CURSOR
DECLARE @cur1 CURSOR
set @cur=CURSOR FOR    
select anclassid,anclass,anclass_en from bsort order by anclassidorder
open    @cur
fetch next from    @cur into @anclassid,@anclass,@anclass_en
WHILE    (@@FETCH_STATUS=0)
BEGIN
  select @count=count(*) from products where anclassids=@anclassid and checked=1 and kucun>0
  if @count<>0
  BEGIN
    set @ename=數據庫.dbo.XML_Encode(@anclass_en)
    select @ptrval=textptr(xmlclass) from ##xmltb
    set @xmlclass='<bigsort anclassid="'+@anclassid+'" name="'+@anclass+'" ename="'+@ename+'">'+char(13)+char(10)
    updatetext ##xmltb.xmlclass @ptrval NULL 0 @xmlclass
    set @cur1=CURSOR FOR    
    select nclassid,nclass,nclass_en from ssort where anclassid = @anclassid order by nclassidorder
    open    @cur1
    fetch next from    @cur1 into @nclassid,@nclass,@nclass_en
    WHILE    (@@FETCH_STATUS=0)
    BEGIN
      select @count1=count(*) from products where nclassids=@nclassid and checked=1 and kucun>0
      if @count1<>0
      BEGIN
        set @ename1=數據庫.dbo.XML_Encode(@nclass_en)
        select @ptrval=textptr(xmlclass) from ##xmltb
        set @xmlclass='<ssort id="'+@nclassid+'" name="'+@nclass+'" ename="'+@ename1+'">'+@nclass+' </ssort>'+char(13)+char(10)
        updatetext ##xmltb.xmlclass @ptrval NULL 0 @xmlclass
      end
    fetch next from    @cur1 into @nclassid,@nclass,@nclass_en
    END
    close @cur1    
    deallocate @cur1
    select @ptrval=textptr(xmlclass) from ##xmltb
    set @xmlclass='</bigsort>'+char(13)+char(10)
    updatetext ##xmltb.xmlclass @ptrval NULL 0 @xmlclass
  end
fetch next from    @cur into @anclassid,@anclass,@anclass_en
end
close @cur    
deallocate @cur
select @ptrval=textptr(xmlclass) from ##xmltb
set @xmlclass='</root>'+char(13)+char(10)
updatetext ##xmltb.xmlclass @ptrval NULL 0 @xmlclass

WHILE @@TRANCOUNT > 0
COMMIT TRAN


exec master.dbo.xp_cmdshell 'bcp "select xmlclass from 數據庫.dbo.##xmltb" queryout "c:\xml\classes_cn.xml" /U"sa" /P"你的密碼" /w' ,no_output    

drop table ##xmltb
GO
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章