急:关于sp_xml_preparedocument

ping2000 2004-10-20 12:28:55
用sp_xml_preparedocument导入数据,当XML文件太大时,就导入失败,
不知道为什么?XML文件大于148K时就无法导入
...全文
269 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ping2000 2004-10-20
  • 打赏
  • 举报
回复
就是用你(zjcxc(邹建))上次教我的方法
ping2000 2004-10-20
  • 打赏
  • 举报
回复
我是用存储过程,create proc p_xml @doc ntext as
变量是ntext类型
zjcxc 2004-10-20
  • 打赏
  • 举报
回复
你传递的参数类型不对吧? 你是怎么使用的?
ping2000 2004-10-20
  • 打赏
  • 举报
回复
终于明白了,是因为我的数据项有英文冒号(:),即有一个商品名称为“双汇2:8碎肉”
zjcxc(邹建),对不起了,也谢谢你了。
zjcxc 2004-10-20
  • 打赏
  • 举报
回复
你先试试我改过的那种处理方法,如果是内存原因,加大内存就可以处理更多,限制内存可以处理列少
ping2000 2004-10-20
  • 打赏
  • 举报
回复
我猜是因为:
“分析过的文档存储在 SQL Server 2000 的内部高速缓存中。MSXML 语法分析器使用 SQL Server 可用总内存的八分之一。若要避免内存不足,请运行 sp_xml_removedocument 以释放内存。”
的限制。


zjcxc 2004-10-20
  • 打赏
  • 举报
回复
--后面还要加去除存储过程的(不加其实也行,反正你每次都会检测是否存在的)

sTmp:=' drop proc p_xml' ;
adocommand.CommandText :=sTmp;
adocommand.Execute ;
zjcxc 2004-10-20
  • 打赏
  • 举报
回复
既然要动态生成存储过程,你也可以这样改啊:

sTmp:=' exec p_xml '''+cds.XMLData+''''
+' drop proc p_xml' ;
adocommand.CommandText :=sTmp;
adocommand.Execute ;

改为:
adocommand.CommandType :=4;
adocommand.CommandText :='p_xml';
adocommand.Parameters.Refresh ;
adocommand.Parameters("@doc") :=cds.XMLData ;
adocommand.Execute ;

MessageDlg('成功导入!', mtWarning, [mbOK], 0);
zjcxc 2004-10-20
  • 打赏
  • 举报
回复
包含 SQL 语句的字符串长度(批处理大小) 65,536 * 网络数据包大小1
1 网络数据包大小是表格格式数据方案 (TDS) 数据包的大小,该数据包用于应用程序和关系数据库引擎之间的通讯。默认的数据包大小为 4 KB,由 network packet size 配置选项控制。
zjcxc 2004-10-20
  • 打赏
  • 举报
回复
你那样是用生成SQL语句的方式,生成的SQL语句长度好像有长度限制的
ping2000 2004-10-20
  • 打赏
  • 举报
回复
不是我的DELPHI程序的问题,动态创建存储过程是因为我要导入很多的表,不太可能对每个表都创建一个存储过程。
而且如果数据量小的话都好好的,一点问题都没有。而数据量大时就不行了,好象是sp_xml_preparedocument的使用有内存限制
zjcxc 2004-10-20
  • 打赏
  • 举报
回复
应该是方法有问题
1. 存储过程只需要在查询分析器中选择你的数据库,创建一次,不需要每次都创建

2.调用的时候,是以参数的形式来传递数据,而不是字符串的形式,因为不会delphi,所以只是根据你上面写出的模拟一下应该做的处理过程,如果有语法错误,你自己改改吧(存储过程要先在你的数据库中建好)


adocommand.CommandType :=4;
adocommand.CommandText :='p_xml';
adocommand.Parameters.Refresh ;
adocommand.Parameters("@doc") :=cds.XMLData ;
adocommand.Execute ;

MessageDlg('成功导入!', mtWarning, [mbOK], 0);
ping2000 2004-10-20
  • 打赏
  • 举报
回复
下面是有两行记录时的XML文本内容,即你用下面的文本替换上面函数中的“+cds.XMLData+”即可正确执行,当数据量太大(大于451行)时就不行了
<?xml version="1.0" standalone="yes"?> <DATAPACKET Version="2.0"><METADATA><FIELDS><FIELD attrname="f_Spbm" fieldtype="string" WIDTH="15"/><FIELD attrname="f_Sphh" fieldtype="string" WIDTH="15"/><FIELD attrname="f_Spmc" fieldtype="string" WIDTH="60"/><FIELD attrname="f_Spcd" fieldtype="string" WIDTH="12"/><FIELD attrname="f_Ggxh" fieldtype="string" WIDTH="20"/><FIELD attrname="f_Sppp" fieldtype="string" WIDTH="20"/><FIELD attrname="f_Sl" fieldtype="r8"/><FIELD attrname="f_Xxsl" fieldtype="r8"/><FIELD attrname="f_Jldw" fieldtype="string" WIDTH="10"/><FIELD attrname="f_Sccsbm" fieldtype="string" WIDTH="12"/><FIELD attrname="f_Ftfs" fieldtype="string" WIDTH="1"/><FIELD attrname="f_Bzq" fieldtype="i4"/><FIELD attrname="f_Xsdj" fieldtype="r8"/><FIELD attrname="f_Zhjj" fieldtype="r8"/><FIELD attrname="f_Zdsj" fieldtype="r8"/><FIELD attrname="f_Hyj" fieldtype="r8"/><FIELD attrname="f_Pfj" fieldtype="r8"/><FIELD attrname="f_Zgkc" fieldtype="r8"/><FIELD attrname="f_Zdkc" fieldtype="r8"/><FIELD attrname="f_Jdrq" fieldtype="string" WIDTH="8"/><FIELD attrname="f_Kzbz" fieldtype="i4"/><FIELD attrname="f_Xskz" fieldtype="i4"/><FIELD attrname="f_Jjqsyf" fieldtype="i4"/><FIELD attrname="f_Jjjsyf" fieldtype="i4"/><FIELD attrname="f_Spbz" fieldtype="string" WIDTH="255"/><FIELD attrname="f_Jb" fieldtype="i4"/><FIELD attrname="f_Mj" fieldtype="i4"/></FIELDS><PARAMS/></METADATA><ROWDATA><ROW f_Spbm="00101001" f_Sphh="001-01001" f_Spmc="小精品脐橙礼品" f_Spcd="" f_Ggxh="0" f_Sppp="" f_Sl="0" f_Xxsl="0" f_Jldw="件" f_Sccsbm="" f_Ftfs="0" f_Bzq="0" f_Xsdj="5.9" f_Zhjj="5.1" f_Zdsj="5.5" f_Hyj="5.6" f_Pfj="5.5" f_Zgkc="2000" f_Zdkc="10" f_Jdrq="20021126" f_Kzbz="0" f_Xskz="0" f_Jjqsyf="0" f_Jjjsyf="0" f_Spbz="" f_Jb="4" f_Mj="1"/><ROW f_Spbm="00101002" f_Sphh="001-01002" f_Spmc="丰水梨礼品" f_Spcd="" f_Ggxh="0" f_Sppp="" f_Sl="0" f_Xxsl="0" f_Jldw="盒" f_Sccsbm="" f_Ftfs="0" f_Bzq="0" f_Xsdj="39" f_Zhjj="35" f_Zdsj="0" f_Hyj="0" f_Pfj="0" f_Zgkc="0" f_Zdkc="0" f_Jdrq="20021126" f_Kzbz="1" f_Xskz="0" f_Jjqsyf="0" f_Jjjsyf="0" f_Spbz="" f_Jb="4" f_Mj="1"/></ROWDATA></DATAPACKET>
ping2000 2004-10-20
  • 打赏
  • 举报
回复
我用delphi6,数据小于等于451行时好好的,大于451行时就报错:“不正常地定义参数对象。提供了不一致或不完整的信息”
procedure TForm1.Button1Click(Sender: TObject);
var
sTmp:widestring;
begin
sTmp:='if exists (select * from dbo.sysobjects where id = object_id(N''[dbo].[p_xml]'') and OBJECTPROPERTY(id, N''IsProcedure'') = 1)'
+' drop procedure [dbo].[p_xml] ';
adocommand.CommandText :=sTmp;
adocommand.Execute ;
sTmp:=' create proc p_xml @doc ntext as DECLARE @idoc int'
+' EXEC sp_xml_preparedocument @idoc OUTPUT, @doc'
+' insert into tbspdabk (f_Spbm,f_Sphh,f_Spmc,f_Spcd,f_Ggxh,f_Sppp,f_Sl,f_Xxsl,f_Jldw,f_Sccsbm,f_Ftfs,f_Bzq,f_Xsdj,f_Zhjj,f_Zdsj,f_Hyj,f_Pfj,f_Zgkc,f_Zdkc,f_Jdrq,f_Kzbz,f_Xskz,f_Jjqsyf,f_Jjjsyf,f_Spbz,f_Jb,f_Mj)'
+' SELECT f_Spbm,f_Sphh,f_Spmc,f_Spcd,f_Ggxh,f_Sppp,f_Sl,f_Xxsl,f_Jldw,f_Sccsbm,f_Ftfs,f_Bzq,f_Xsdj,f_Zhjj,f_Zdsj,f_Hyj,f_Pfj,f_Zgkc,f_Zdkc,f_Jdrq,f_Kzbz,f_Xskz,f_Jjqsyf,f_Jjjsyf,f_Spbz,f_Jb,f_Mj'
+' FROM OPENXML (@idoc,''/DATAPACKET/ROWDATA/ROW'',1)'
+' WITH (f_Spbm varchar(15),f_Sphh varchar(15),f_Spmc varchar(60),f_Spcd varchar(12),f_Ggxh varchar(20),f_Sppp varchar(20),f_Sl float,f_Xxsl float,f_Jldw varchar(10),f_Sccsbm varchar(12),f_Ftfs varchar(1),f_Bzq int,'
+' f_Xsdj float,f_Zhjj float,f_Zdsj float,f_Hyj float,f_Pfj float,f_Zgkc float,f_Zdkc float,f_Jdrq varchar(8),f_Kzbz int,f_Xskz int,f_Jjqsyf int,f_Jjjsyf int,f_Spbz varchar(255),f_Jb int,f_Mj int)'
+' EXEC sp_xml_removedocument @idoc ';
adocommand.CommandText :=sTmp;
adocommand.Execute ;
sTmp:=' exec p_xml '''+cds.XMLData+''''
+' drop proc p_xml' ;
adocommand.CommandText :=sTmp;
adocommand.Execute ;

MessageDlg('成功导入!', mtWarning, [mbOK], 0);
zjcxc 2004-10-20
  • 打赏
  • 举报
回复
你发个数据给我测试一下,你是用什么开发语言调用存储过程的?
ping2000 2004-10-20
  • 打赏
  • 举报
回复
自己顶

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧