Как просмотреть полное содержимое столбца text или varchar (MAX) в SQL Server 2008 Management Studio? - PullRequest
82 голосов
/ 03 мая 2010

В этой действующей базе данных SQL Server 2008 (сборка 10.0.1600) есть таблица Events, которая содержит столбец text с именем Details. (Да, я понимаю, что на самом деле это должен быть столбец varchar(MAX), но тот, кто настраивал эту базу данных, делал это не так.)

В этом столбце содержатся очень большие журналы исключений и связанные данные JSON, к которым я пытаюсь получить доступ через SQL Server Management Studio, но всякий раз, когда я копирую результаты из сетки в текстовый редактор, он усекает его до 43679 символов.

Я читал в различных местах в Интернете, что вы можете установить для параметра Максимальное количество символов, извлеченных для данных XML в Tools > Options > Query Results > SQL Server > Results To Grid значение Неограниченно, а затем выполнить запрос, такой как:

select Convert(xml, Details) from Events
where EventID = 13920

(Обратите внимание, что данные столбца вообще не являются XML. CONVERT Использование столбца в XML - это просто обходной путь, который я нашел в Googling, что кто-то еще использовал, чтобы обойти ограничение, которое SSMS получает при получении данных из text или varchar(MAX) столбец.)

Однако после установки вышеуказанной опции, выполнения запроса и перехода по ссылке в результате я все равно получаю следующую ошибку:

Невозможно показать XML. Произошла следующая ошибка: Неожиданный конец файла произошел. Строка 5, позиция 220160.

Одним из решений является увеличение количества символов, извлекаемых с сервера для данных XML. Чтобы изменить этот параметр, в меню «Сервис» выберите «Параметры».

Итак, есть идеи о том, как получить доступ к этим данным? Будет ли преобразование столбца в varchar(MAX) исправить мои проблемы?

Ответы [ 9 ]

80 голосов
/ 03 мая 2010

Одна хитрость, которая может сработать в довольно ограниченных обстоятельствах, - это просто назвать колонку особым образом, как показано ниже.

DECLARE @S varchar(max) = 'A'

SET @S =  REPLICATE(@S,100000) + 'B' 

SELECT @S as [XML_F52E2B61-18A1-11d1-B105-00805F49916B]

В SSMS 2012 и 2014 это отображает результаты, как показано ниже

enter image description here

Нажатие на нее открывает все результаты в средстве просмотра XML. Прокрутка вправо показывает, что последний символ B сохранен,

Однако это имеет некоторые существенные проблемы. Добавление дополнительных столбцов к запросу нарушает эффект, и все дополнительные строки объединяются с первым. Наконец, если строка содержит такие символы, как <, открытие средства просмотра XML завершится неудачно с ошибкой синтаксического анализа.

Более надежный способ сделать это, чтобы избежать проблем с преобразованием SQL Server < в &lt; и т. Д. Или сбоев из-за этих символов, приведен ниже ( кредит Адама Маханича здесь ).

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('')
37 голосов
/ 01 апреля 2016

Я смог заставить это работать ...

SELECT CAST('<![CDATA[' + LargeTextColumn + ']]>' AS XML) FROM TableName;
17 голосов
/ 08 марта 2017

Один из способов - щелкнуть правой кнопкой мыши на наборе результатов и выбрать «Сохранить результаты как ...» Это экспортирует его в файл CSV со всем содержимым столбца. Не идеально, но сработало для меня достаточно.

Workaround

8 голосов
/ 06 декабря 2017

Вы пробовали это простое решение? Всего 2 клика!

В окне запроса,

  1. установить параметры запроса на "Результаты в сетку", выполнить запрос
  2. Щелкните правой кнопкой мыши вкладку результатов в углу сетки, сохраните результаты в виде любых файлов

Вы получите весь текст, который хотите увидеть в файле !!! Я вижу 130 556 символов для моего результата поля varchar (MAX)

Results in a file

4 голосов
/ 13 марта 2014

Самый простой обходной путь, который я нашел, - сделать резервную копию таблицы и просмотреть скрипт. Для этого

  1. Щелкните правой кнопкой мыши свою базу данных и выберите Tasks> Generate Scripts...
  2. страница "Введение" нажмите Next
  3. Страница "Выбор объектов"
    1. Выберите Select specific database objects и выберите таблицу.
    2. Нажмите Next
  4. Страница «Настройка параметров сценариев»
    1. Установите тип выхода на Save scripts to a specific location
    2. Выберите Save to file и заполните соответствующие параметры
    3. Нажмите кнопку Advanced
    4. Установите General> Types of data to script на Data only или Schema and Data и нажмите ok
    5. Нажмите Next
  5. «Сводная страница» нажмите далее
  6. Ваш сценарий sql должен быть сгенерирован на основе параметров, установленных вами в 4.2. Откройте этот файл и просмотрите ваши данные.
3 голосов
/ 03 мая 2010

Тип данных TEXT устарел и больше не должен использоваться, поэтому трудно выбрать данные из столбца TEXT.

текст, текст и изображение (Transact-SQL)

типы данных ntext, text и image будет удален в будущей версии Microsoft SQL Server. Избегать использования эти типы данных в новой разработке работать и планировать модифицировать приложения которые в настоящее время используют их. использование nvarchar (max), varchar (max) и вместо varbinary (max).

вам нужно использовать TEXTPTR (Transact-SQL) для извлечения текстовых данных.

Также см. Эту статью о Обработка типа текстовых данных .

2 голосов
/ 03 мая 2010

Похоже, что 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

Затем вам нужно будет снова объединить их вручную.

EDIT

Похоже, в данных text есть некоторые символы, которые не нравятся парсеру Xml. Вы можете попробовать преобразовать эти значения в сущности, а затем попробовать трюк Convert(xml, data). Так что-то вроде:

Update Table
Set Data = Replace(Cast(Data As varchar(max)),'<','&lt;')

(Мне нужно было привести к varchar (max), потому что функция замены не будет работать на столбцах text. Не должно быть никаких причин, по которым вы не могли преобразовать эти столбцы text в varchar(max).)

0 голосов
/ 28 октября 2016

Я предпочитаю этот простой XML-хак, который делает столбцы кликабельными в SSMS для каждой ячейки. С помощью этого метода вы можете быстро просмотреть свои данные в табличном представлении SSMS и щелкнуть по отдельным ячейкам, чтобы увидеть все значения, когда они интересны. Это идентично методике OP, за исключением того, что позволяет избежать ошибок XML.

SELECT
     e.EventID
    ,CAST(REPLACE(REPLACE(e.Details, '&', '&amp;'), '<', '&lt;') AS XML) Details
FROM Events e
WHERE 1=1
AND e.EventID BETWEEN 13920 AND 13930
;
0 голосов
/ 03 мая 2010

Думаю, вам не повезло. Проблема не в уровне SQL, как все остальные ответы, а в простом пользовательском интерфейсе. Management Studio не является универсальным интерфейсом доступа к данным. Это не ваш интерфейс, а ваша административная область, и у него есть серьезные ограничения на обработку двоичных данных и больших тестовых данных - потому что люди, использующие его в указанном профиле использования, не столкнутся с этой проблемой.

Представление больших текстовых данных просто не является запланированным использованием.

Ваш единственный выбор - функция с табличным значением, которая принимает ввод текста и обрезает его по строкам для каждой строки, так что Management Studio получает список строк, а не одну строку.

...