現(xiàn)有主表(銷售人員表),次表(銷售明細(xì)表),請寫一存儲過程把這兩表的數(shù)據(jù)導(dǎo)出指定格式的XML文件(格式如下),要求存儲過程參數(shù)包括:數(shù)據(jù)庫服務(wù)器名、數(shù)據(jù)庫名、數(shù)據(jù)庫用戶名、數(shù)據(jù)庫密碼、導(dǎo)出文件完整路徑。
<?xml version="1.0" encoding="GBK"?>
<data version="1.0" >
<!--第一位銷售員銷售明細(xì)開始-->
<!--主表開始 -->
<main>
<id>p1</id>
<name>張三</name>
</main>
<!--主表結(jié)束 -->
<!--明細(xì)表開始 -->
<detail>
<ID>c1</ID>
<ParentID>p1</ParentID>
<productname>產(chǎn)品1</productname>
</detail>
<detail>
<ID>c2</ID>
<ParentID>p1</ParentID>
<productname>產(chǎn)品2</productname>
</detail>
<!--明細(xì)表結(jié)束 -->
<!--第一位銷售員銷售明細(xì)結(jié)束-->
<!--第二位銷售員銷售明細(xì)開始-->
<!--主表開始 -->
<main>
<id>p2</id>
<name>李四</name>
</main>
<!--主表結(jié)束 -->
<!--明細(xì)表開始 -->
<detail>
<ID>c3</ID>
<ParentID>p2</ParentID>
<productname>產(chǎn)品3</productname>
</detail>
<detail>
<ID>c4</ID>
<ParentID>p2</ParentID>
<productname>產(chǎn)品4</productname>
</detail>
<!--明細(xì)表結(jié)束 -->
<!--第二位銷售員銷售明細(xì)結(jié)束-->
</data>
答案:
--銷售明細(xì)xml生成存儲過程
CREATE procedure pageer_rnewlist
(
@hostname varchar(50), --主機(jī)IP
@dbname varchar(50), --數(shù)據(jù)庫名
@username varchar(50), --用戶名
@password varchar(50), --密碼
@xmlpath varchar(50) --xml輸出路徑
)
begin
--數(shù)據(jù)庫登陸
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)
--人員信息游標(biāo)創(chuàng)建
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,銷售明細(xì)表 b
where
b.id = a.parentid
order by a.id '
EXEC (@tempSQL)
--創(chuàng)建全局臨時表
create table ##tb(re varchar(8000))
INSERT INTO ##tb
--插入頭信息
select '<?xml version="1.0" encoding="GBK"?>
<data version="1.0" >'
INSERT INTO ##tb
--打開游標(biāo)
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;
--明細(xì)xml生成
SELECT '<detail>'
'<ID>'+CUR_COUNID.did+'</ID>'
'<ParentID>'+CUR_COUNID.id+'</ParentID>'
'<productname>'+CUR_COUNID.productname+'</productname>'
'</detail>';
INSERT INTO ##tb
--保存當(dāng)前記錄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
--刪除鏈接服務(wù)器
exec sp_dropserver 'srv_lnk','droplogins'
end