В этом живом SQL Server 2008 (создают 10.0.1600) база данных, существует Events
таблица, которая содержит a text
столбец называют Details
. (Да, я понимаю, что это должно на самом деле быть a varchar(MAX)
столбец, но кто бы ни настроил эту базу данных, не сделал этого тот путь.)
Этот столбец содержит очень большие журналы исключений и связанных данных JSON, к которым я пытаюсь получить доступ через Studio управления SQL Server, но каждый раз, когда я копирую результаты сетки в текстовый редактор, это усекает его в 43 679 символах.
Я читал на различных местоположениях в Интернете, в котором можно установить Максимальные Символы, Полученные для Данных XML Tools > Options > Query Results > SQL Server > Results To Grid
к Неограниченному, и затем выполняют запрос, такой как это:
select Convert(xml, Details) from Events
where EventID = 13920
(Обратите внимание, что данные являются столбцом, не XML вообще. CONVERT
луг столбец к XML является просто обходным решением, которое я нашел от поиска с помощью Google этого, кто-то еще раньше обходил предел SSMS, имеет от получения данных из a text
или varchar(MAX)
столбец.)
Однако после установки опции выше, выполнение запроса и нажимание на ссылку в результате, я все еще получаю следующую ошибку:
Не мог показать XML. Следующая ошибка произошла: Неожиданный конец файла произошел. Строка 5, положение 220160.
Одно решение состоит в том, чтобы увеличить число символов, полученных с сервера для данных XML. Для изменения этих настроек, в меню Tools, нажимают Options.
Так, какая-либо идея о том, как получить доступ к этим данным? Был бы, преобразовывая столбец в varchar(MAX)
зафиксировать мое горе?
SSMS разрешает неограниченное количество данных только для данных XML. Это не значение по умолчанию, и его необходимо установить в параметрах.
Один из приемов, который может сработать в весьма ограниченных обстоятельствах, - это просто присвоить столбцу специальное имя, как показано ниже, чтобы он обрабатывался как данные XML.
DECLARE @S varchar(max) = 'A'
SET @S = REPLICATE(@S,100000) + 'B'
SELECT @S as [XML_F52E2B61-18A1-11d1-B105-00805F49916B]
В SSMS (по крайней мере, версии с 2012 по текущая версия 18.3) отображаются результаты, как показано ниже.
При щелчке по нему открываются полные результаты в средстве просмотра XML. Прокрутка вправо показывает, что последний символ B сохраняется,
Однако здесь есть некоторые существенные проблемы. Добавление дополнительных столбцов в запрос прерывает эффект, и все дополнительные строки объединяются с первой. Наконец, если строка содержит такие символы, как <
, открытие средства просмотра XML завершается ошибкой синтаксического анализа.
Более надежный способ сделать это, позволяющий избежать проблем, связанных с преобразованием SQL Server <
в <
и т. Д. Или отказом из-за этих символов, приведен ниже ( кредит Adam Machanic здесь ).
DECLARE @S varchar(max)
SELECT @S = ''
SELECT @S = @S + '
' + OBJECT_DEFINITION(OBJECT_ID) FROM SYS.PROCEDURES
SELECT @S AS [processing-instruction(x)] FOR XML PATH('')
Думаю, вам не повезло. Проблема не является проблемой уровня SQL, как кажется, все остальные ответы, а просто одним из пользовательского интерфейса. Management Studio не предназначена для использования в качестве универсального интерфейса доступа к данным. Это не ваш интерфейс, а ваша административная область, и она имеет серьезные ограничения на обработку двоичных данных и больших тестовых данных - потому что люди, использующие его в указанном профиле использования, не столкнутся с этой проблемой.
Представление больших текстовых данных просто не запланировано.
Единственным выбором будет функция с табличным значением, которая берет вводимый текст и вырезает из него строки для каждой строки, так что Management Studio получает список строк, а не одну строку.
Тип данных TEXT устарел и больше не должен использоваться, это боль при выборе данных из ТЕКСТОВОГО столбца.
ntext, text и image (Transact-SQL)
ntext, text и image типы данных будут удалены в будущей версии Microsoft SQL Server. Избегайте использования этих типов данных в новых разработках и запланируйте изменение приложений , которые в настоящее время их используют. Вместо этого используйте nvarchar (max), varchar (max) и varbinary (max).
вам необходимо использовать TEXTPTR (Transact-SQL) для получения текстовых данных.
См. Также эту статью о Обработка типа текстовых данных .
Похоже, XML-код сформирован неправильно. В этом случае вы не сможете преобразовать его как Xml, и, учитывая это, вы ограничены в том, сколько текста вы можете вернуть в Management Studio. Однако вы можете разбить текст на более мелкие куски следующим образом:
With Tally As
(
Select ROW_NUMBER() OVER ( ORDER BY s1.object_id ) - 1 As Num
From sys.sysobjects As s1
Cross Join sys.sysobjects As s2
)
Select Substring(T1.textCol, T2.Num * 8000 + 1, 8000)
From Table As T1
Cross Join Tally As T2
Where T2.Num <= Ceiling(Len(T1.textCol) / 8000)
Order By T2.Num
Затем вам нужно будет снова вручную объединить их.
РЕДАКТИРОВАТЬ
Похоже, есть некоторые символы в текстовых
данных, которые не нравятся синтаксическому анализатору Xml.Вы можете попробовать преобразовать эти значения в сущности, а затем попробовать трюк Convert (xml, data)
. Примерно так:
Update Table
Set Data = Replace(Cast(Data As varchar(max)),'<','<')
(Мне нужно было преобразовать в varchar (max), потому что функция замены не будет работать с столбцами text
. Не должно быть никаких причин, по которым вы не можете преобразовать эти text
столбцы до varchar (max)
.)