近公司與一家供應商合作,要求把供應商的XML 數據導入到我公司的數據庫中,以方便業務處理.我公司使用的是SQL Server 2005 數據庫.查了一下幫助文件,很簡單的寫了個腳本,如下:
SELECT * into #temp1 FROM OPENROWSET(
BULK 'D:700000015.XML' ,SINGLE_CLOB ) AS x
DECLARE @hdoc int
DECLARE @doc varchar(8000)
select @doc=BulkColumn from #temp1
EXEC sp_XML_preparedocument @hdoc OUTPUT,@doc
SELECT * into #temp2
FROM OPENXML (@hdoc, '/AA/BB,2)
with (A varchar(50),B varchar(50),C varchar(50) )
exec sp_XML_removedocument @hdoc
先是使用一個較小的文件,測試了一下,通過.但當使用真正數據時,提示說XML 標記沒有閉合.經查看,原來並沒有把所有的數據都寫入到@doc中,於是又找幫助,@doc 可以使用ntext ,text ,xml ,varchar,char等類型.試著改為ntext,text 都沒有成功,原因是ntext ,text 類型不能直接定義成變量.於是使用了SQL Server 2005 的類型新成員:XML.結果是500KB以下的文件全部通過.當文件大於500KB時,還是報錯.於是有回去看幫助.試著把SINGLE_CLOB 改為SINGLE_BLOB .最終解決了問題.由於沒有時間測試更大的文件,我只是試了在800KB以內的文件.其實,SINGLE_BLOB 代表的是varbinary(max)類型.能有多長是根據它來限制的.
最終更改如下:
SELECT * into #temp1 FROM OPENROWSET(
BULK 'D:700000015.XML' ,SINGLE_BLOB ) AS x
DECLARE @hdoc int
DECLARE @doc XML
select @doc=BulkColumn from #temp1
EXEC sp_XML_preparedocument @hdoc OUTPUT,@doc
SELECT * into #temp2
FROM OPENXML (@hdoc, '/AA/BB,2)
with (A varchar(50),B varchar(50),C varchar(50) )
exec sp_XML_removedocument @hdoc