Sql server 从C#.NET中的TSQL FOR XML语句读取大型XML字符串
使用FOR XML的SQL命令返回一个长XML作为SqlString。我的问题是将长XML字符串读入.NET C# 以下仅读取前2033个字符Sql server 从C#.NET中的TSQL FOR XML语句读取大型XML字符串,sql-server,xml,tsql,Sql Server,Xml,Tsql,使用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.
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路径提供了我所需要的内容,而且速度很快。我尝试了一个常规查询,然后使用Xdocument生成XML,但性能非常糟糕,甚至超过100行,因为它需要在sID上搜索以添加XML。我想我可以将连接编写为一个SQL函数,以避免FOR XML自动生成,但使用FOR XML的查询速度很快,并提供了我需要的确切结果。这只是如何检索结果?这是一个已知问题,请参阅:
改用
ExecuteXmlReader
。根本原因是SQL分解了返回的XML,因此您需要以不同的方式读取回复。我在使用VBScript的ADO中也遇到了同样的问题。将整个结果包装在select中似乎对我有效,即:
select (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'))
你确定SQL返回正确的数据吗?使用ExecuteXmlReader:同样,这与:基本相同,但是你可以比我稍微多使用一点rep!这不适用于OP的问题。问题不是SQL没有返回正确的XML,而是当SQL查询返回一个大的XML字符串时,.NET framework会将其切分为2033个字符的部分。如果你没有正确的阅读方法,你永远不会得到超过前2033个字符。