使用FOR XML的SQL命令将单个长XML作为SqlString返回 . 我的问题是将长XML字符串读入.NET C# .
以下仅读取前2033个字符
SqlDataReader rdr = command.ExecuteReader();
if (rdr.HasRows)
{
rdr.Read();
Debug.WriteLine(rdr[0].ToString().Length.ToString());
}
我也尝试过command.ExecuteScalar和rdr.GetString,但仍然只获得前2033个字符 . 我已经更改了排序,它仍然在2033截断,所以它不太可能是由坏字符引起的 . 尝试rdr.GetSqlXml并获取错误消息无法将SqlString强制转换为SqlCachedBuffer .
如果我限制SQL返回少于2033个字符,我会得到完整有效的XML . 所以我不认为这是一个XML解析问题,而只是一个截断 . 我不需要任何XML解析 - 它是TSQL语句中的有效XML,我需要它作为字符串 .
如何阅读完整的XML(作为文本)?
TSQL有效 .
select top 10 docSVsys.sID, docSVsys.docID
, (select top 10 value + '; '
from docMVtext with (nolock) where docMVtext.sID = docSVsys.sID
and docMVtext.fieldID = '113'
order by value FOR XML PATH('') ) as [To]
from docSVsys with (nolock)
order by docSVsys.sID
for xml auto, root('documents')
FOR XML PATH提供了我所需要的和快速的 . 我尝试了常规查询,然后使用Xdocument生成XML,但是性能非常糟糕,甚至超过100行,因为它需要在sID上搜索以添加To . 我想我可以将连接编写为SQL函数以避免FOR XML AUTO,但使用FOR XML的查询速度很快,并提供了我需要的确切结果 . 这是如何检索结果?
2 回答
这是一个已知问题,请参阅:http://support.microsoft.com/kb/310378
请改用
ExecuteXmlReader
. 根本原因是SQL分解了返回的XML,因此您需要以不同方式阅读回复 . 我在使用VBScript的ADO中遇到了同样的问题 .将整个结果包装成选择似乎对我有用,即: