Як переглянути повний вміст тексту або стовпця varchar (MAX) у SQL Server 2008 Management Studio?


94

У цій базі даних 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)виправити моє горе?

Відповіді:


97

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 - CDATAРіч була моєю першою пропозицією. Пізніший з них AS [processing-instruction(x)]уникає цього.
Martin Smith

1
@MartinSmith відмінна відповідь! Цікаво, скільки я дізнався з ваших відповідей! +1
Кін Шах


25

Одне навколо - клацнути правою кнопкою миші на наборі результатів і вибрати "Зберегти результати як ...". Це експортує його у файл CSV із усім вмістом стовпця. Не ідеально, але для мене працювало досить добре.

Вирішення проблем


10

Ви пробували це просте рішення? Всього 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-даних (fyi, стовпці таблиці типу XML можуть зберігати лише 2 ГБ). Тоді як результати до тексту обмежені 8192 символами на стовпець. Щоб встановити ці максимальні обмеження за замовчуванням, просто перейдіть до меню (у SSMS) TOOLS, потім ОПЦІЇ ..., потім ЗАПИТАННЯ РЕЗУЛЬТАТІВ, потім 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)стовпця.
Адамджфорд,

1
РЕДАКТУЙТЕ свій код вище; з Tally As (Виберіть ROW_NUMBER () НАД (ЗАМОВИТИ ПО s1.id) - 1 як Num From sys.sysobjects As s1 Cross Join sys.sysobjects As s2) Select Substring (T1.YourTextCol, T2.Num * 8000 + 1, 8000) З YourTable As T1 Cross Приєднуйтесь до Tally As T2 Де T2.Num <= Стеля (довжина даних (T1.YourTextCol) / 8000) Замовлення за T2.Num
Ян Квіглі

Використання 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значення поля). Приведення не вдасться для рядків із такими вбудованими значеннями.
binki

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 отримує список рядків, а не один рядок.


Я вважаю, що ця відповідь - це в кращому випадку здогадка, чи у вас є джерела для "запланованого використання"? Якщо це "студія управління" SQL, вона, як мінімум, має змогу показати мені вміст моїх баз даних. Абсолютно жахливий інтерфейс.
проклятий

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