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

时间:2011-12-12 16:16:34

标签: 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.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 个答案:

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