日期:2014-05-18  浏览次数:20530 次

高手请进,在线等待:从SQL导出指定格式的XML文件
现有主表(销售人员表),次表(销售明细表),欲把这两表的数据导出指定格式的XML文件(格式如下),请问如何导出?又因为数据库服务器名、数据库名、数据库用户名及密码、导出文件完整路径等参数,都要求可以灵活设置。因此,敬请高手给出一存储过程,把灵活可设置的参数做为存储过程参数,谢谢。


<?xml   version= "1.0 "   encoding= "GBK "?>
<data   version= "1.0 "   >
<!--第一位销售员销售明细开始-->
    <!--主表开始   -->
    <main>
  <id> p1 </id>
  <name> 张三 </name>  
    </main>
    <!--主表结束   -->
    <!--明细表开始   -->
    <detail>
<ID> c1 </ID>
  <ParentID> p1 </ParentID>
  <productname> 产品1 </productname>
    </detail>

    <detail>
  <ID> c2 </ID>
  <ParentID> p1 </ParentID>
  <productname> 产品2 </productname>
    </detail>
      <!--明细表结束   -->
<!--第一位销售员销售明细结束-->
   
<!--第二位销售员销售明细开始-->
    <!--主表开始   -->
    <main>
  <id> p2 </id>
  <name> 李四 </name>  
    </main>
    <!--主表结束   -->
    <!--明细表开始   -->
    <detail>
<ID> c3 </ID>
  <ParentID> p2 </ParentID>
  <productname> 产品3 </productname>
    </detail>

    <detail>
  <ID> c4 </ID>
  <ParentID> p2 </ParentID>
  <productname> 产品4 </productname>
    </detail>
      <!--明细表结束   -->
<!--第二位销售员销售明细结束-->
</data>

------解决方案--------------------
测试表:
drop table main,detail
create table main(id varchar(20),name varchar(20))
insert main select 'p1 ', '张三 '
union all select 'p2 ', '李四 '
create table detail(id varchar(20),ParentID varchar(20),productname varchar(20))
insert detail select 'c1 ', 'p1 ', '产品1 '
union all select 'c2 ', 'p1 ', '产品2 '
处理函数和存储过程:
create function linksql(
@id varchar(20))
returns varchar(8000)
begin
declare @v1 varchar(8000)
select @v1= ' '
select @v1=(case when [id] is not null then
@v1+ ' <ID> '+[id]+ ' </ID> <ParentID> '+@id+ ' </ParentID> <productname> '+productname+ ' </productname> '
else null end)
from detail where ParentID=@id
return (case when @v1 <> ' ' then ' <detail> '+@v1+ ' </detail> ' else null end)
end
go
IF EXISTS(SELECT * FROM SYSOBJECTS WHERE NAME= 'p1 ' AND TYPE= 'p ')DROP PROC P1
GO

create proc p1
@dbname varchar(20),
@srvname varchar(30),
@filepath varchar(50),
@username varchar(20),
@psw varchar(30)
as
begin
declare @var varchar(8000)
exec(
' if exists(select * from sysobjects where name= ' 'aa ' ' and type= ' 'U ' ' ) drop table master.dbo.aa
select ' ' <!--主表开始 --> <m