Усечение SQL Server и ограничение 8192 - PullRequest
44 голосов
/ 04 июня 2009

В SQL Server 2005 я пытаюсь запросить столбец varchar (MAX), в котором есть несколько строк с текстовыми данными, которые превышают 8192. Тем не менее, в Management Studio у меня под Инструменты -> Параметры -> Запрос Результаты -> Результаты в текст -> Максимальное количество символов, отображаемых в каждом столбце = 8192 , что является максимумом. Соответственно, кажется, что усечение этих строк происходит только из-за ограничений, накладываемых текстовым выводом.

Единственное, что я вижу, чтобы обойти это, - это использование функции SUBSTRING для получения, скажем, первых 8000 символов, затем следующих 8000 символов и т. Д. И т. П.

Я должен отметить, что SSIS и BCP для меня не варианты.

У кого-нибудь есть лучшее предложение? Спасибо!

Ответы [ 10 ]

65 голосов
/ 22 августа 2011

Вы можете экспортировать данные в плоский файл, который не будет усечен. Для этого:

  1. Щелкните правой кнопкой мыши базу данных
  2. Нажмите Задачи -> Экспорт данных
  3. Выберите источник данных (по умолчанию должно быть в порядке)
  4. Выберите «Назначение плоского файла» для типа назначения.
  5. Выберите имя файла для вывода.
  6. В поле «Указать копию таблицы или запрос» выберите «Написать запрос, чтобы указать данные для передачи»
  7. Вставить в ваш запрос

Остальные шаги должны быть самоочевидными. Это выведет файл в текст, и вы сможете открыть его в своем любимом текстовом редакторе.

27 голосов
/ 01 апреля 2011

Я также использую XML, но немного другой метод , который решает большинство проблем с энтитизацией XML.

declare @VeryLongText nvarchar(max) = '';

SELECT top 100 @VeryLongText = @VeryLongText + '

' + OBJECT_DEFINITION(object_id) 
FROM sys.all_objects 
WHERE type='P' and is_ms_shipped=1

SELECT LEN(@VeryLongText)

SELECT @VeryLongText AS [processing-instruction(x)] FOR XML PATH('')

PRINT @VeryLongText /*WILL be truncated*/

Убедитесь, что лимит «XML-данных» в SSMS установлен достаточно высоко!

Screenshot

5 голосов
/ 26 октября 2010

Мое решение было немного обыденным, но привело меня туда (если вывод меньше 65535 символов) :

  1. В SQL Management Studio установите ограничение для результатов сетки: 65535 (Инструменты> Параметры> Результаты запроса> SQL Server> Результаты в таблицу> Данные не в формате XML)
  2. Запустить запрос, вывести в сетку
  3. Щелкните правой кнопкой мыши результаты, выберите «Сохранить результаты как ...» и сохраните результаты в файл
  4. Откройте файл в блокноте или аналогичном, чтобы получить вывод

ОБНОВЛЕНИЕ : Чтобы продемонстрировать, что это работает, вот несколько SQL, которые выбирают один столбец из 100 000 символов. Если я сохраню вывод сетки в файл CSV, все 100 000 символов будут там без усечения.

DECLARE @test nvarchar(MAX), @i int, @line nvarchar(100)
SET @test = ''; SET @i = 100
WHILE @i < 100000
BEGIN
    SET @test = @test + STUFF(REPLICATE('_', 98) + CHAR(13) + CHAR(10), 1, LEN(CAST(@i AS nvarchar)), CAST(@i AS nvarchar))
    SET @i = @i + 100
END
SELECT @test

Примечания:

  1. Кажется, что не имеет значения, какова настройка длины символа, как я обычно думал.
  2. Я использую SQL 2008 R2 (и сервер, и Management Studio)
  3. Кажется, что не имеет значения, если длинный столбец хранится в локальной переменной (как в этом примере) или выбран из фактической таблицы
4 голосов
/ 04 сентября 2014

Я столкнулся с этим, пытаясь экспортировать XML. Это решение, которое я использовал:

Выберите параметр «Результат в сетку», щелкните правой кнопкой мыши ссылку, отображаемую на панели «Результаты», затем выберите «Сохранить результаты как», выберите тип файла «Все файлы», присвойте файлу имя и нажмите «Сохранить». Все данные XML правильно сохранены в файл.

Я использую SSMS 10 и не могу заставить работать решение Торре. Мастер экспорта продолжал думать, что входной столбец был изображением:

Тип данных "входной столбец" XML_F52E2B61-18A1-11d1-B105-00805F49916B "(26)" - DT_IMAGE

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

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

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

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

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

Just Two Clicks away!

0 голосов
/ 14 февраля 2017

Еще один обходной путь, используйте HeidiSql для сложных запросов. Не имеет ограничений по длине поля.

0 голосов
/ 28 января 2017

В SSMS, если вы выбираете данные из строки, они ограничены небольшим количеством символов, но если вы редактируете данные из строки, там будет полное значение. Это может быть не всегда, но если вы нажмете ctrl-a, ctrl-c, а затем в редакторе, то все это будет там.

0 голосов
/ 01 апреля 2011

Я обычно использую XML, чтобы получить огромную строку отладки в качестве вывода (используя тестовый набор от Люка):

    declare @test nvarchar(max), @i int, @line nvarchar(100)
    set @test = ''; set @i = 100
    while @i < 100000
    begin
        set @test = @test + stuff(replicate('_', 98) + char(13) + char(10), 1, len(cast(@i as nvarchar)), cast(@i as nvarchar))
        set @i = @i + 100
    end
    -- ctrl+d for "results to grid" then click the xml output
    --select cast('<root>' + @test + '</root>' as xml)

-- revised
select @test for xml path(''), type;
0 голосов
/ 04 июня 2009

Если бы у меня был выбор, я бы попросил запрос вернуть данные как «Для XML Auto», «Для XML Raw» или «Для XML явный», таким образом, ограничения намного выше, и вы можете сделать гораздо больше с ожидаемыми результатами. .

0 голосов
/ 04 июня 2009

Усечение, о котором вы говорите, происходит только в Management Studio. Если вы перетащите столбец в другое приложение, он не будет усечен.

Нет способа использовать Query Analyzer для общения с SQL Server 2005. Вы имеете в виду Management Studio?

...