[S] SQLXML使用时出现超奇怪问题

Semigod 2004-10-12 12:29:07
在Table1表中只有一个ntext字段 s
执行下面的SQL

declare @a nvarchar(200)
set @a = '<s>asdfasfasd</s>'
declare @tree int
exec sp_xml_preparedocument @tree output, @a
update table1 set s=t.s from openxml (@tree, '/', 2) with (s ntext '/s') as t
exec sp_xml_removedocument @tree
go

结果居然是:
(0 rows affected)

这是怎么回事,我发现只要把 with (s ntext '/s') 中的ntext 换成nvarchar就会正常。不知道有没有人知道原因,和解决方法?

分不够可再加
...全文
215 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Semigod 2004-10-13
  • 打赏
  • 举报
回复
我当然是通过xml传入,用openxml解析出来的,我还不至于笨到直接用text来传变量,还来这里提问题吧
zjcxc 元老 2004-10-12
  • 打赏
  • 举报
回复
你的程序能调用存储过程正常存/取ntext变量数据到表

这只能说明SQL处理ntext变量没问题,而我上面也没有任何一个地方对这个质疑过

所以你说的
"我的程序调用 存储过程传入2万字的ntext,存储过程不但将数据保存到表中,而且我还能够用程序读取完全一致的结果,那这还不能说明SQL Server 处理是正确的吗?那你觉得怎样才是正确的?"


根本就不是我提出的问题所在,也解释不了我提出的问题.
zjcxc 元老 2004-10-12
  • 打赏
  • 举报
回复
我前面已经说明过几次:

不是SQL处理ntext变量有问题

而是openxml解析ntext/text属性值时有问题

问题不在ntext/text变量上,是在openxml的解析上


希望楼主看清楚我上面的说明

zjcxc 元老 2004-10-12
  • 打赏
  • 举报
回复
我在查询分析器中做的测试,而不是osql

我也用VB调用ADO同样的测试过我的存储过程,测试的结果与查询分析器的一样
Semigod 2004-10-12
  • 打赏
  • 举报
回复
我的程序调用 存储过程传入2万字的ntext,存储过程不但将数据保存到表中,而且我还能够用程序读取完全一致的结果,那这还不能说明SQL Server 处理是正确的吗?那你觉得怎样才是正确的?
Semigod 2004-10-12
  • 打赏
  • 举报
回复
我说过,你上面的方法在OSQL中确实结果不正确 。但是,当你自己使用ADO来做类似操作时(我的程序是用VC写的),结果肯定是正确的。
zjcxc 元老 2004-10-12
  • 打赏
  • 举报
回复
楼主可以用我上面的测试,把我上面的注明的地方用print的结果替换,就可以看到,SQL确定解析不出完整的结果

还有一些不稳定的情况,比如,楼主将 print 的结果删除10位左右,再执行那个测试,会报错:
服务器: 消息 6603,级别 16,状态 1,过程 A,行 10
XML 分析错误: 系统错误: 265926。
zjcxc 元老 2004-10-12
  • 打赏
  • 举报
回复

--示例存储过程
CREATE procedure A
@xml text
AS
declare @hDoc int
set nocount on

exec sp_xml_preparedocument @hDoc out,@xml

select datalength(a),datalength(@xml)-7
FROM OPENXML(@hDoc,'/a',1) WITH(a text '.')
exec sp_xml_removedocument @hDoc
return(0)
go

--调用
exec A '<a>这里是下面的粘贴下面print的结果</a>'
go

drop proc A

/*--结果,可以看出,解析的结果是不正确的:

----------- -----------
3998 11987

--*/

print replicate('a',8000)
zjcxc 元老 2004-10-12
  • 打赏
  • 举报
回复
你的程序,还是用SQL的openxml来解析

你的程序正常,只能证明程序中处理是正常的,怎么能说明SQL中的处理是正常的呢?
Semigod 2004-10-12
  • 打赏
  • 举报
回复
我知道,但我的程序成功的处理了类似desc这种值的数据,保存下来,还读出来了。可见,SQLServer解析XML是正常的
zjcxc 元老 2004-10-12
  • 打赏
  • 举报
回复
不是处理ntext长度受限

是解析ntext/text属性的值时受限,你用我的测试一样可以测试得出,传递过去的 @XMLDATA 是没有被截断的,只是解析出 desc 这个属性值(text类型)时被截断了而已.
Semigod 2004-10-12
  • 打赏
  • 举报
回复
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
我又试过了,
首先证明了 SQL Server 在处理ntext上长度是不受限制的。前面朋友的那个例子确实会出问题,但是,我发现,用自己的程序通过ADO SQLOLEDB连接服务器,使用时是没有问题的(我的参数是逐个放入参数列表中去的)。

同时我发现,我的程序成功更改了一个20000字符长度的ntext变量后,在VisualStudio中查看那个表的数据时,相应字段显示为空,不报错。而使用OSQL 查询相应字段,数据确是正确的。
zjcxc 元老 2004-10-12
  • 打赏
  • 举报
回复
--楼主可以用下面的来测试,证明SQL解析text/ntext数据有问题.

--楼主用复制粘贴的方法,把下面的xml内容中desc="afsdfasf"换成超过80000的,再执行语句进行测试就可以看出,SQL解析的结果只到了 3986 的长度,后面的没有了

--示例数据
create table table1(id int,name varchar(100),[desc] text)
insert table1 select 1,'张三','测试'
go

CREATE procedure A
@XMLDATA text
AS
declare @hDoc int

set nocount on
exec sp_xml_preparedocument @hDoc OUTPUT, @XMLDATA

select datalength([desc]),* FROM OPENXML(@hDoc,'//record',1) WITH table1 x
exec sp_xml_removedocument @hDoc
return(0)
go

--调用
exec A '
<Database>
<record id="1" name="aaa" desc="afsdfasf" />
</Database>'
go

drop proc A


zjcxc 元老 2004-10-12
  • 打赏
  • 举报
回复
declare @a nvarchar(200)
set @a = '<s>asdfasfasd</s>'
declare @tree int
exec sp_xml_preparedocument @tree output, @a
select * from openxml (@tree, '/', 2) with (s ntext '/s') as t
exec sp_xml_removedocument @tree

--直接解析,可以得到值,但update就会出错.

zjcxc 元老 2004-10-12
  • 打赏
  • 举报
回复
没办法,SQL的XML处理解析不了text/ntext的值

楼主看看这个帖,和你的情况差不多.
http://community.csdn.net/Expert/topic/3442/3442103.xml?temp=.8359186
zjcxc 元老 2004-10-12
  • 打赏
  • 举报
回复
没办法,SQL的XML处理解析不了text/ntext
net_steven 2004-10-12
  • 打赏
  • 举报
回复
楼主强啊,确实有这个现象.
可以用一个临时表(或表变量)过渡一下:
-----------------------------------------------
declare @a nvarchar(200)
set @a = '<s>asdfasfasd</s>'
declare @tree int
exec sp_xml_preparedocument @tree output, @a
select * into #tmp from openxml (@tree, '/', 2) with (s ntext '/s') as t
update table1 set s=t.s from #tmp as t
exec sp_xml_removedocument @tree
select * from table1
------------------------------------------------
lovvver 2004-10-12
  • 打赏
  • 举报
回复
学习学习

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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