Усечение SQL Server и ограничение 8192
В SQL Server 2005 я пытаюсь запросить столбец varchar(MAX), в котором есть несколько строк с текстовыми данными, которые превышают 8192. Тем не менее, в Management Studio я имею в разделе Инструменты -> Параметры -> Результаты запроса -> Результаты, чтобы Текст -> Максимальное количество символов, отображаемых в каждом столбце = 8192, что является максимумом. Соответственно, кажется, что усечение в этих строках происходит только из-за ограничений, накладываемых текстовым выводом.
Единственное, что я вижу, чтобы обойти это, - это использовать функцию SUBSTRING, чтобы получить, скажем, первые 8000 символов, затем следующие 8000 символов и т. Д. И т. Д. Но это уродливо и подвержено ошибкам.
Я должен отметить, что SSIS и BCP не являются вариантами для меня.
У кого-нибудь есть лучшее предложение? Спасибо!
10 ответов
Вы можете экспортировать данные в плоский файл, который не будет усечен. Сделать это:
- Щелкните правой кнопкой мыши базу данных
- Нажмите Задачи -> Экспорт данных
- Выберите ваш источник данных (по умолчанию должно быть в порядке)
- Выберите "Назначение плоского файла" в качестве типа назначения.
- Выберите имя файла для вывода.
- В поле "Указать копию таблицы или запрос" выберите "Написать запрос, чтобы указать данные для передачи"
- Вставьте в ваш запрос
Остальные шаги должны быть самоочевидными. Это выведет файл в текст, и вы можете открыть его в своем любимом текстовом редакторе.
Я также использую 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 установлено достаточно высоким!
Вы пробовали это простое решение? Всего 2 клика!
В окне запроса
- установите параметры запроса на "Результаты в сетку", запустите запрос
- Щелкните правой кнопкой мыши вкладку результатов в углу сетки, сохраните результаты в виде любых файлов.
Вы получите весь текст, который хотите увидеть в файле!!! Я вижу 130 556 символов для моего результата поля varchar(MAX)
Мое решение было немного обыденным, но оно меня дошло (если вывод меньше 65535 символов):
В SQL Management Studio установите ограничение для результатов сетки - 65535 (Инструменты> Параметры> Результаты запроса> SQL Server > Результаты в сетку> Данные не в формате XML).- Запустить запрос, вывести в сетку
- Щелкните правой кнопкой мыши результаты, выберите "Сохранить результаты как..." и сохраните результаты в файл.
- Откройте файл в блокноте или аналогичном, чтобы получить вывод
ОБНОВЛЕНИЕ: Чтобы продемонстрировать, что это работает, вот несколько 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
Заметки:
- Кажется, не имеет значения, какова длина символа, как я и думал.
- Я использую SQL 2008 R2 (как сервер, так и Management Studio)
- Кажется, не имеет значения, хранится ли длинный столбец в локальной переменной (как в этом примере) или выбран из фактической таблицы.
Я столкнулся с этим, пытаясь экспортировать XML. Это решение, которое я использовал:
Выберите параметр "Результат в сетку", щелкните правой кнопкой мыши ссылку, которая отображается на панели "Результаты", затем выберите "Сохранить результаты как", выберите тип файла "Все файлы", присвойте файлу имя и нажмите "Сохранить". Все данные XML правильно сохранены в файл.
Я использую SSMS 10, и я не могу заставить работать решение Торре. Мастер экспорта продолжал думать, что входной столбец был изображением:
Тип данных для "входного столбца"XML_F52E2B61-18A1-11d1-B105-00805F49916B" (26)" - DT_IMAGE
В SSMS, если вы выбираете данные из строки, они ограничены небольшим количеством символов, но если вы редактируете данные из строки, там будет полное значение. Это не всегда может быть там, но если вы нажмете Ctrl-A, Ctrl-C, а затем в редакторе, все это будет там.
Другой обходной путь, используйте HeidiSql для этих сложных запросов. У него нет ограничений по длине поля.
Усечение, о котором вы говорите, происходит только в Management Studio. Если вы перетащите столбец в другое приложение, он не будет усечен.
Вы не можете использовать Query Analyzer для общения с SQL Server 2005. Вы имеете в виду Management Studio?
Если бы у меня был выбор, я бы попросил запрос вернуть данные как "Для XML Auto", "Для XML Raw" или "Для XML явный", таким образом, ограничения намного выше, и вы можете сделать гораздо больше с полученными результатами.
Я обычно использую XML, чтобы получить огромную строку отладки в качестве выходных данных (используя тестовый набор из Luke):
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;