Sql server 从C#.NET中的TSQL FOR XML语句读取大型XML字符串

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.

使用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路径提供了我所需要的内容,而且速度很快。我尝试了一个常规查询,然后使用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个字符。