【发布时间】:2025-12-19 10:35:06
【问题描述】:
有一个带有 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 的查询速度很快并且提供了我需要的确切结果。只是如何检索结果?
【问题讨论】:
-
你确定SQL返回正确的数据吗?
-
使用 ExecuteXmlReader:support.microsoft.com/kb/310378
标签: sql-server xml tsql