Как просмотреть полное содержимое столбца text или varchar (MAX) в SQL Server 2008 Management Studio?


98

В этой действующей базе данных 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 - это просто обходной путь, который я нашел в Google, который кто-то использовал для обхода ограничения, которое SSMS имеет на получение данных из столбца textили varchar(MAX).)

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

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

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

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

Ответы:


98

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 <в и &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('')

2
Добавление CDATA в оператор Convert сработало! Большое спасибо. :)
adamjford

Добавление CDATAможет работать, но если ваши данные содержат управляющие символы, вам необходимо выполнить операцию замены. В моем случае я использовал разделитель единиц, код ASCII 31, в своих данных. Поскольку я использовал только этот один символ во многих местах, достаточно простого REPLACE(details, char(31), '&x1f;'). Если бы мне нужно было заменить неизвестные символы или большое количество разных символов, мне, возможно, пришлось бы найти другое решение.
Zarepheth 07

@Zarepheth - Это CDATAбыло мое первое предложение. Последний AS [processing-instruction(x)]избегает этого.
Мартин Смит

2
@MartinSmith отличный ответ! Интересно, как много я узнаю из ваших ответов! +1
Кин Шах


28

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

Обходной путь


11

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

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

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

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

Результаты в файле


1
Прямо - легко - и всегда о нем забывают, пока он вам снова не понадобится :)
Дими Такис

5

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

  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и нажмите ОК
    5. Нажмите Next
  5. "Страница сводки" нажмите "Далее"
  6. Ваш sql-скрипт должен быть создан на основе параметров, установленных в 4.2. Откройте этот файл и просмотрите свои данные.

3

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

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

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

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

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


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

Сначала я бы использовал SSMS для создания скрипта для преобразования вашего столбца TEXT в varchar (max). Оттуда вы можете оценить, хотите ли вы преобразовать его в столбец XML. Что касается пределов отображения SSMS, результаты в сетке могут быть настроены для отображения до 65 535 символов не xml-данных на столбец и до неограниченного количества xml-данных (к сведению, столбцы таблицы типа XML могут хранить только 2 ГБ). Хотя результаты для текста ограничены 8192 символами в столбце. Чтобы установить эти максимальные ограничения по умолчанию, просто перейдите в (в SSMS) меню ИНСТРУМЕНТЫ, затем ОПЦИИ ... затем РЕЗУЛЬТАТЫ ЗАПРОСА, затем SQL-СЕРВЕР, затем РЕЗУЛЬТАТЫ В СЕТКУ или РЕЗУЛЬТАТЫ В ТЕКСТ.
КМ.

3

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

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

РЕДАКТИРОВАТЬ

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

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

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


О, я полагаю, я должен упомянуть, что этот столбец вообще не является XML. ПРЕОБРАЗОВАНИЕ столбца в XML - это просто обходной путь, который я нашел в Google, который кто-то использовал, чтобы обойти ограничение, которое SSMS имеет на получение данных из столбца textили varchar(MAX).
adamjford

1
ИЗМЕНИТЬ код выше; С Tally As (выберите ROW_NUMBER () OVER (ORDER BY s1.id) - 1 As Num From sys.sysobjects As s1 Cross Join sys.sysobjects As s2) Select Substring (T1.YourTextCol, T2.Num * 8000 + 1, 8000) From YourTable As T1 Cross Join Tally As T2 Где T2.Num <= Ceiling (datalength (T1.YourTextCol) / 8000) Order By T2.Num
Ian Quigley

Использование TSQLот @IanQuigley на основе этого ответа сработало для меня. Я в основном взял результаты (в итоге получилось 11 записей) и просто склеил их в Блокноте. Работает отлично. Необходимо сохранить этот скрипт. У меня был какой-то сумасшедший длинный XML, содержащий недопустимые символы.
atconway

1

Я предпочитаю этот простой 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
;

Обратите внимание, что некоторые символы недопустимы в XML 1.0, но действительны в NVARCHAR/ VARCHAR. Например, символ NUL (отличный от NULLзначения поля). Приведение не будет выполнено для строк с такими встроенными значениями.
Бинки,

1

Начиная с SSMS 18.2, вы можете просматривать до 2 миллионов символов в результатах сетки. Источник

Разрешить отображение большего количества данных (результат в текст) и сохранение в ячейках (результат в сетку). SSMS теперь позволяет использовать до 2 млн символов для обоих.

Я проверил это с помощью кода ниже.

DECLARE @S varchar(max) = 'A'

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

SELECT @S as a

1
Максимальное количество символов на самом деле составляет 2097152 ( в версии SSMS 15.0.18333.0 ).
stomy

0

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

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

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


Мне кажется, что этот ответ - в лучшем случае предположение, или у вас есть какие-либо источники для "запланированного использования"? Если это «студия управления» SQL, она должна, по крайней мере, иметь возможность показать мне содержимое моих баз данных. Абсолютно ужасный интерфейс.
damd

Этот ответ следует удалить, поскольку он больше не применим
Кай Джард
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.