У меня есть код:
DECLARE @Script VARCHAR(MAX)
SELECT @Script = definition FROM manged.sys.all_sql_modules sq
where sq.object_id = (SELECT object_id from managed.sys.objects
Where type = 'P' and Name = 'usp_gen_data')
Declare @Pos int
SELECT @pos=CHARINDEX(CHAR(13)+CHAR(10),@script,7500)
PRINT SUBSTRING(@Script,1,@Pos)
PRINT SUBSTRING(@script,@pos,8000)
Длина скрипта составляет около 10 000 символов, и поскольку я использую оператор печати, который может содержать не более 8000 символов, я использую два оператора печати.
Проблема в том, что у меня есть сценарий, который, скажем, состоит из 18000 символов, тогда я использовал 3 оператора печати.
Итак, есть ли способ установить количество операторов печати в зависимости от длины скрипта?
PRINT
или вы открыты для других альтернатив?Ответы:
Вы можете сделать
WHILE
цикл на основе счетчика длины вашего скрипта, разделенного на 8000.НАПРИМЕР:
источник
SUBSTR
и посмотреть только на ту часть, с которой вы имеете дело в то время, и повторить это, или если вы знаете, что каждый раз будет разрыв строки до ограничения 8k, тогда просто сделайте наWHILE
основе найденной строки перерывы.print(substring(@script, @Counter * 8000, (@Counter + 1) * 8000))
печатал свой сценарий.Я знаю, что это старый вопрос, но то, что я сделал, здесь не упоминается.
Для меня сработало следующее.
источник
max
.DECLARE @info NVARCHAR(MAX) = 'A';SET @info = REPLICATE(@info, 16000) + 'BC This is not printed';PRINT @info;PRINT CAST(@info AS NTEXT);
В следующем обходном пути этот
PRINT
оператор не используется . Он хорошо работает в сочетании с SQL Server Management Studio.Вы можете щелкнуть возвращенный XML, чтобы развернуть его во встроенной программе просмотра XML.
На стороне клиента существует довольно щедрое ограничение на отображаемый размер. При необходимости перейдите к,
Tools/Options/Query Results/SQL Server/Results to Grid/XML data
чтобы отрегулировать его.источник
<
заменяется на<
.<root>....
таких:SELECT CAST(@MyLongString AS XML)
SELECT @MyLongString AS [processing-instruction(x)] FOR XML PATH('')
. Строка будет заключена в PI с именем «x», но PI не будет заключена в другой элемент (из-заPATH('')
).Вот как это нужно делать:
Взято из http://ask.sqlservercentral.com/questions/3102/any-way-around-the-print-limit-of-nvarcharmax-in-s.html
источник
Столкнулся с этим вопросом и захотелось чего-то более простого ... Попробуйте следующее:
источник
SELECT CAST(@STMT AS XML)
как уже было сказано в другом комментарии. Производит точно такой же вывод и действительно менее сложен, чем создание хранимой процедуры для вывода.Этот процесс правильно распечатывает
VARCHAR(MAX)
параметр с учетом упаковки:источник
Я хотел использовать оператор печати для отладки некоторого динамического sql, поскольку я представляю, что большинство из вас использует печать по тем же причинам.
Я попробовал несколько из перечисленных решений и обнаружил, что решение Келси работает с небольшими изменениями (@sql - мой @script) nb LENGTH не является допустимой функцией:
Этот код делает, как прокомментировано, добавляет новую строку в вывод, но для отладки это не проблема для меня.
Решение Бена Б. идеально и является наиболее элегантным, хотя для отладки требуется много строк кода, поэтому я решил использовать свою небольшую модификацию решения Келси. Возможно, стоит создать систему, подобную хранимой процедуре в msdb, для кода Бена Б., которую можно было бы повторно использовать и вызывать в одной строке?
Код Алфокса, к сожалению, не работает, потому что это было бы проще.
источник
Вы можете использовать это
источник
Я только что создал SP из отличного ответа Бена :
источник
источник
Есть отличная функция PrintMax, написанная Беннеттом Диллом .
Вот немного измененная версия, которая использует временную хранимую процедуру, чтобы избежать "загрязнения схемы" (идея из https://github.com/Toolien/sp_GenMerge/blob/master/sp_GenMerge.sql )
Демо DBFiddle
РЕДАКТИРОВАТЬ:
С помощью
CREATE OR ALTER
можно было избежать двух вызовов EXEC:db <> fiddle Demo
источник
Использует перевод строки и пробелы в качестве хорошей точки останова:
источник
Или просто:
источник
Вот еще одна версия. Он извлекает каждую подстроку для печати из основной строки вместо того, чтобы уменьшать основную строку на 4000 в каждом цикле (что может создать много очень длинных строк под капотом - не уверен).
источник
Это должно работать правильно, это просто улучшение предыдущих ответов.
источник
Если в исходном коде не будет проблем с заменой LF на CRLF, не требуется отладка, следуя простым выводам кода.
источник
Моя версия PrintMax для предотвращения плохих разрывов строк при выводе:
источник