使用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的查询速度很快,并提供了我需要的确切结果。它只是如何检索结果?
答案 0 :(得分:11)
这是一个已知问题,请参阅:http://support.microsoft.com/kb/310378
请改用ExecuteXmlReader
。根本原因是SQL分解了返回的XML,因此您需要以不同方式阅读回复。我在使用VBScript的ADO中遇到了同样的问题。
答案 1 :(得分:0)
将整个结果包装成选择似乎对我有用,即:
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'))