风舞残阳 2008-4-2 17:54
SQL Server 2005 读取xml 文件 突破 varchar 8000 限制
[size=3][/size]最近公司与一家供应商合作,要求把供应商的xml数据导入到我公司的[wiki]数据库[/wiki]中,以方便业务处理.我公司使用的是[wiki]SQL[/wiki]SERVER2005数据库.查了一下帮助文件,很简单的写了个脚本,如下:
SELECT*into#temp1FROMOPENROWSET(
BULK'D:\0700000015.xml',SINGLE_CLOB)ASx
DECLARE@hdocint
DECLARE@docvarchar(8000)
select@doc=BulkColumnfrom#temp1
EXECsp_xml_preparedocument@hdocOUTPUT,@doc
SELECT*into#temp2
FROMOPEN[wiki]XML[/wiki](@hdoc,'/AA/BB,2)
with(Avarchar(50),Bvarchar(50),Cvarchar(50))
execsp_xml_removedocument@hdoc
先是使用一个较小的文件,[wiki]测试[/wiki]了一下,通过.但当使用真正数据时,提示说XML标记没有闭合.经查看,原来并没有把所有的数据都写入到@doc中,于是又找帮助,@doc可以使用ntext,text,xml,varchar,char等[wiki]类[/wiki]型.试着改为ntext,text都没有成功,原因是ntext,text类型不能直接定义成变量.于是使用了SQLServer2005的类型新成员:xml.结果是500KB以下的文件全部通过.当文件大于500KB时,还是报错.于是有回去看帮助.试着把SINGLE_CLOB改为SINGLE_BLOB.最终解决了问题.由于没有[wiki]时间[/wiki]测试更大的文件,我只是试了在800KB以内的文件.其实,SINGLE_BLOB代表的是varbinary(max)类型.能有多长是根据它来限制的.
最终更改如下:
SELECT*into#temp1FROMOPENROWSET(
BULK'D:\0700000015.xml',SINGLE_BLOB)ASx
DECLARE@hdocint
DECLARE@docxml
select@doc=BulkColumnfrom#temp1
EXECsp_xml_preparedocument@hdocOUTPUT,@doc
SELECT*into#temp2
FROMOPENXML(@hdoc,'/AA/BB,2)
with(Avarchar(50),Bvarchar(50),Cvarchar(50))
execsp_xml_removedocument@hdoc