2009-06-04 3 views
40

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

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

Следует упомянуть, что SSIS и BCP не являются параметрами для меня.

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

+1

касается того, как вывод, что отображается в Query Analyzer Вы? Если вы просто используете его для просмотра данных, я бы не стал слишком зависеть от «ошибок, подверженных» и «уродливого» кода. Если вы используете его для производственной работы, это совсем другая проблема. –

+0

Том: Я не просто смотрю на данные. Я использую вывод запроса для генерации новых вызовов хранимых процедур для удаленного сервера, поэтому результат должен быть «идеальным». –

+1

Но зачем использовать SSMS для выполнения запроса? Что произойдет, если вы выполните один и тот же запрос из программы? –

ответ

57

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

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

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

+0

+1 для решения, которое работает без необходимости создания настраиваемого инструмента. Мне нужно было экспортировать XML-данные без изменения форматирования (интервала), поэтому экспорт XML не был вариантом. – mlhDev

+0

Это должен быть принятый ответ. –

+0

Спасибо @ Торре .. он спас мой день :) –

0

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

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

+0

Я думаю, что он имеет в виду Management Studio. Если вы переключитесь на «Результаты на сетку», он отображает максимальное число в столбце как 65535. Не уверен, что это приблизит вас, хотя, похоже, вы пытаетесь создать код в SQL? – GalacticCowboy

+0

Извините, я имею в виду Management Studio. –

0

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

+0

Это также усекает вывод ... –

+0

@Jaco - Но вы можете настроить предел XML в SSMS, чтобы избежать этого. См. Мой ответ. –

4

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

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

UPDATE: Для того, чтобы продемонстрировать, что это работает, вот некоторые SQL, который выбирает один столбец 100000 символов. Если я сохраню вывод сетки в файл 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. Это, кажется, не имеет никакого значения то, что установка длины символов, как я orignally подумал.
  2. Я использую SQL 2008 R2 (как сервер, так и Management Studio)
  3. Не похоже, чтобы длинный столбец был сохранен в локальной переменной (как в этом примере) или выбран из фактическая таблица
+1

Это не работает. Файл по-прежнему имеет усеченные данные. – SFun28

+0

Извините, что это не сработало для вас. Я добавил код, который показывает, как я тестировал, что он работает, и некоторые примечания о условиях, при которых я знаю, что это работает. –

+1

Не работает и для меня. MS SQL Management Studio 2008 R2. –

0

Я обычно использую 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

Вдувается, если '@ test' содержит' 2 <3' –

+0

Хорошая точка. Вы можете позволить xml-пути заменить их ... не уверен, что это то, что вам нужно. По крайней мере, не взорвать :) Проверьте ревизионные PLS. –

+0

Не взорвать, но это изменяет результат! –

25

Я также использую XML, но a slightly different method, который получает вокруг большинства вопросов с XML entitisation.

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

+2

Ясно лучшее решение. –

+0

есть ли способ иметь данные без xml, показанные как неограниченные, и отказ от ограничения? Я вижу, что нижний предел составляет 30 и выше - 65535. – pordi

+0

@BabekoofCoder - К сожалению, нет. Следовательно, необходимость в отливке без xml в качестве метода обхода XML. –

3

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

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

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

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

+0

У меня была и проблема 'DT_IMAGE', но она работала вокруг нее, добавив в мой XML-генератор другой', type', внешний 'select() как columnname' и проверив флажок Unicode в мастере экспорта. – Nathan

0

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

0

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

2

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

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

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

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

Just Two Clicks away!