Усечение SQL Server и ограничение 8192

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

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

Я должен упомянуть, что SSIS и BCP мне не подходят.

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


person Ash Machine    schedule 04.06.2009    source источник
comment
Вас беспокоит, как вывод отображается в Query Analyzer? Если вы просто используете его для просмотра данных, я бы не стал слишком зацикливаться на подверженном ошибкам и уродливом коде. Если вы используете его для производственной работы, это уже другая проблема.   -  person Tom H    schedule 04.06.2009
comment
Том: Я не просто смотрю на данные. Я использую выходные данные запроса для создания новых вызовов хранимых процедур для удаленного сервера, поэтому результат должен быть «идеальным».   -  person Ash Machine    schedule 04.06.2009
comment
Но зачем использовать SSMS для выполнения запроса? Что произойдет, если вы выполните тот же запрос из программы?   -  person John Saunders    schedule 04.06.2009
comment
SSMS2008 даже обрезает, когда я выбираю вывод в файл. Хм!!!   -  person IsmailS    schedule 24.02.2011
comment
Самым простым способом для меня было преобразовать строку в xml (как показано на stackoverflow.com/a/2760023/278044) . Management Studio можно настроить так, чтобы разрешить неограниченный размер XML.   -  person Eldritch Conundrum    schedule 09.11.2015


Ответы (10)


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

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

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

person Torre Lasley    schedule 22.08.2011
comment
+1 за решение, которое работает без написания специального инструмента. Мне нужно было экспортировать данные XML без изменения форматирования (интервалов), поэтому экспорт в формате XML был невозможен. - person mlhDev; 18.06.2012
comment
Спасибо @Torre .. это спасло мне день :) - person Suhani Mody; 29.01.2015
comment
У меня не получилось. Все еще обрезается. Могу ли я пропустить какой-либо другой важный шаг (который не требует пояснений)? - person mythicalcoder; 01.09.2015
comment
@Maven, это будет экспортировать в файл, ничего не изменится внутри редактора ... вы говорите, что он усекается внутри выходного файла? Не видел этого раньше ... - person Torre Lasley; 03.09.2015
comment
да. В выходном файле каждая из ячеек, содержащих более 4 КБ символов, усекается. В любом случае, мне нужно было получить определение каждой хранимой процедуры через запрос. Есть обходной путь .. - person mythicalcoder; 03.09.2015
comment
Настройки по умолчанию во время экспорта не работали; Я вручную выбрал Data Source .Net Framework Data Provider для SQL Server ... вручную указал исходный каталог источника данных, интегрированную безопасность; и использовал вывод в виде плоского файла Unicode; в моем случае я использовал FOR JSON PATH - person The Red Pea; 14.08.2019
comment
Я получаю Source data type "22" was not found in the data type mapping file. ошибку при попытке экспорта. - person Sphynx; 22.02.2021

Я также использую 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 установлен достаточно высоким!

Снимок экрана

person Martin Smith    schedule 01.04.2011
comment
Есть ли способ, чтобы данные, отличные от XML, отображались как неограниченные, и отказ от ограничения? Я вижу, что нижняя граница 30, а выше - 65535. - person Pradip; 15.01.2016
comment
@BabekoofCoder - К сожалению, нет. Следовательно, необходимо использовать преобразование не xml в качестве обходного пути XML. - person Martin Smith; 15.01.2016
comment
Это хороший ответ, но он сбивает с толку. Вам просто нужна одна строка с «XML PATH». - person N73k; 28.11.2016
comment
Откройте новое окно запроса после внесения изменений в параметры запроса - существующие окна не затронуты. - person Resource; 22.02.2017
comment
select @variable for xml path ('') отлично поработал для меня, обойдя ограничение в 65536 символов, которое я получал. Спасибо! - person tsilb; 06.03.2020

Мое решение было немного обходным, но привело меня туда (пока вывод меньше 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. Кажется, не имеет значения, хранится ли длинный столбец в локальной переменной (как в этом примере) или выбирается из реальной таблицы.
person Community    schedule 26.10.2010
comment
Сожалеем, что это не сработало для вас. Я добавил код, показывающий, как я тестировал его работу, и несколько примечаний об условиях, при которых я знаю, что это работает. - person ; 10.12.2010
comment
У меня тоже не работает. MS SQL Management Studio 2008 R2. - person Stefan Brendle; 09.04.2015
comment
У меня это отлично сработало в SQL Server Management Studio 2016! - person Tim Wilson; 22.11.2016

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

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

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

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

Всего два клика!

person Jenna Leaf    schedule 05.12.2017

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

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

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

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

person Cindy Conway    schedule 04.09.2014
comment
У меня тоже была эта DT_IMAGE проблема, но я решил ее обойти, добавив еще , type, внешний select() as columnname вокруг моего XML-генерирующего оператора и установив флажок Unicode в мастере экспорта. - person Nathan; 29.09.2015

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

person Larry K    schedule 27.01.2017

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

person Avitus    schedule 04.06.2009
comment
@Jaco - Но вы можете настроить ограничение XML в SSMS, чтобы этого избежать. Смотрите мой ответ. - person Martin Smith; 01.04.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;
person Nathan Skerl    schedule 01.04.2011
comment
Взрывается, если @test содержит 2 < 3 - person Martin Smith; 01.04.2011
comment
Хорошая точка зрения. Вы можете позволить xml-пути заменить их ... хотя не уверен, что вам это нужно. По крайней мере не взорвать :) Проверяйте ревизию, пожалуйста. - person Nathan Skerl; 01.04.2011
comment
Никакого взрыва, но результат меняет! - person Martin Smith; 01.04.2011

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

person cpsaez    schedule 14.02.2017

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

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

person Joel Coehoorn    schedule 04.06.2009
comment
Я думаю, он действительно имеет в виду Management Studio. Если вы переключитесь с результатов на сетку, максимальное значение на столбец будет равно 65535. Не уверен, что это приблизит вас, хотя - похоже, вы пытаетесь создать код в SQL? - person GalacticCowboy; 04.06.2009
comment
Извините, я имею в виду Management Studio. - person Ash Machine; 04.06.2009