【问题标题】:Read Large XML String from TSQL FOR XML Statement in C# .NET从 C# .NET 中的 TSQL FOR XML 语句读取大 XML 字符串
【发布时间】: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-server xml tsql


【解决方案1】:

这是一个已知问题,请参阅:http://support.microsoft.com/kb/310378

请改用ExecuteXmlReader。根本原因是 SQL 分解了返回的 XML,因此您需要以不同的方式阅读回复。我在使用 VBScript 的 ADO 中也遇到了同样的问题。

【讨论】:

  • 但是你可以比我使用代表稍微多一点!
【解决方案2】:

将整个结果包装在一个选择中似乎对我有用,即:

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'))

【讨论】:

  • 这不适用于 OP 的问题。问题不在于 SQL 没有返回正确的 XML,而是当您的 SQL 查询返回一个大的 XML 字符串时,它会被 .NET 框架分割成 2033 个字符的部分。如果你没有以正确的方式阅读它,你永远不会得到超过前 2033 个字符。