Чтение большой строки XML из инструкции TSQL FOR XML в С#.NET
Имейте команду SQL с FOR XML, которая возвращает один длинный XML как SqlString. Моя проблема заключается в чтении длинной строки XML в .NET С#.
Следующие только считывают первые 2033 символа
SqlDataReader rdr = command.ExecuteReader();
if (rdr.HasRows)
{
rdr.Read();
Debug.WriteLine(rdr[0].ToString().Length.ToString());
}
Я также пробовал команду .ExecuteScalar и rdr.GetString и все еще получаю первые 2033 символа. Я изменил сортировку, и она все еще усекается в 2033 году, поэтому она вряд ли вызвана плохим характером. Tried rdr.GetSqlXml и получить сообщение об ошибке не может передать SqlString в SqlCachedBuffer.
Если я ограничу SQL возвратом менее 2033 символов, я получу полный допустимый XML. Поэтому я не думаю, что это проблема синтаксического анализа XML, а не просто усечение. Мне не нужен синтаксический анализ XML - это действительно XML из инструкции TSQL, которая мне нужна в качестве строки.
Как я могу прочитать полный 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 обеспечивает то, что мне нужно и быстро. Я попробовал регулярный запрос, а затем генерировал XML, используя Xdocument, но производительность ужасна даже с более чем 100 строк, так как для поиска в sID необходимо добавить значение To. Думаю, я мог бы написать конкатенацию как функцию SQL, чтобы избежать FOR XML AUTO, но этот запрос с FOR XML выполняется быстро и предоставляет точные результаты, которые мне нужны. Это как получить результат?
Это известная проблема: http://support.microsoft.com/kb/310378
Вместо этого используйте ExecuteXmlReader. Основная причина заключается в том, что SQL разбивает возвращаемый XML, поэтому вам нужно прочитать ответ по-разному. У меня была такая же проблема в ADO, используя VBScript.
P.S. Я вижу, как Тим ответил тем же самым ответом, пока я писал.
Обертка всего результата в элементе, похоже, работает для меня, а именно:
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'))