现有主表(销售人员表),次表(销售明细表),请写一存储过程把这两表的数据导出指定格式的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>
答案:
--销售明细xml生成存储过程
CREATE procedure pageer_rnewlist
(
@hostname varchar(50), --主机IP
@dbname varchar(50), --数据库名
@username varchar(50), --用户名
@password varchar(50), --密码
@xmlpath varchar(50) --xml输出路径
)
begin
--数据库登陆
exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB',@hostname
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,@username,@password
go
declare @errorInfo varchar(200) --错误信息
declare @tempSQL varchar(1000)
--人员信息游标创建
set @tempSQL = ' declare idCursor cursor for '+ CHAR(13) + CHAR(10)
set @tempSQL = @tempSQL +
' select a.id id,
a.name name,
b.id did,
b.productname pname
from 销售人员表 a,销售明细表 b
where
b.id = a.parentid
order by a.id '
EXEC (@tempSQL)
--创建全局临时表
create table ##tb(re varchar(8000))
INSERT INTO ##tb
--插入头信息
select '<?xml version="1.0" encoding="GBK"?>
<data version="1.0" >'
INSERT INTO ##tb
--打开游标
OPEN idCursor;
IF(@@CURSOR_ROWS = 0 )
BEGIN
CLOSE idCursor
DEALLOCATE idCursor
set @errorInfo = '没有指定表名或存储过程名!'
print @errorInfo
return
END
declare @id VARCHAR2(50) = '';
FETCH NEXT FROM CUR_COUNID INTO CUR_COUNID;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
--判断是否存储过的id
IF CUR_COUNID.id <> @id THEN
--主表xml生成
SELECT '<main>'
'<id>'+CUR_COUNID.id+'</id>'
'<name>'+CUR_COUNID.name+'</name>'
'</main>';
INSERT INTO ##tb
ELSE
END IF;
--明细xml生成
SELECT '<detail>'
'<ID>'+CUR_COUNID.did+'</ID>'
'<ParentID>'+CUR_COUNID.id+'</ParentID>'
'<productname>'+CUR_COUNID.productname+'</productname>'
'</detail>';
INSERT INTO ##tb
--保存当前记录id
@id = CUR_COUNID.id;
FETCH NEXT FROM CUR_COUNID INTO CUR_COUNID;
END
CLOSE idCursor
DEALLOCATE idCursor
--生成xml
exec master..xp_cmdshell 'bcp ##tb out ' + @xmlpath
drop table ##tb
--删除链接服务器
exec sp_dropserver 'srv_lnk','droplogins'
end