首页 文章

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

提问于
浏览
6

使用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的查询速度很快,并提供了我需要的确切结果 . 这是如何检索结果?

2 回答

  • 11

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

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

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

相关问题