Saya memiliki kode yaitu:
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)
Panjang Script sekitar 10.000 Karakter dan Karena saya menggunakan Pernyataan cetak yang hanya dapat menampung maksimal 8000. Jadi saya menggunakan dua pernyataan cetak.
Masalahnya adalah ketika saya memiliki skrip yang mengatakan 18000 karakter maka saya biasanya menggunakan 3 pernyataan cetak.
Jadi apakah ada cara agar saya bisa mengatur jumlah pernyataan cetak tergantung pada panjang skrip?
PRINT
atau terbuka untuk alternatif lain?Jawaban:
Anda dapat melakukan
WHILE
perulangan berdasarkan jumlah panjang skrip dibagi 8000.MISALNYA:
sumber
SUBSTR
dan melihat hanya bagian yang Anda hadapi pada saat itu dan mengulanginya atau jika Anda tahu bahwa akan ada jeda baris sebelum batas 8k setiap kali maka lakukan sajaWHILE
berdasarkan garis pencarian istirahat.print(substring(@script, @Counter * 8000, (@Counter + 1) * 8000))
mencetak skrip saya.Saya tahu ini pertanyaan lama, tetapi apa yang saya lakukan tidak disebutkan di sini.
Bagi saya yang berikut ini berhasil.
sumber
max
.DECLARE @info NVARCHAR(MAX) = 'A';SET @info = REPLICATE(@info, 16000) + 'BC This is not printed';PRINT @info;PRINT CAST(@info AS NTEXT);
Solusi berikut tidak menggunakan
PRINT
pernyataan tersebut. Ia bekerja dengan baik dalam kombinasi dengan SQL Server Management Studio.Anda dapat mengklik XML yang dikembalikan untuk memperluasnya di XML viewer built-in.
Ada batasan sisi klien yang cukup besar pada ukuran yang ditampilkan. Buka untuk
Tools/Options/Query Results/SQL Server/Results to Grid/XML data
menyesuaikannya jika perlu.sumber
<
diganti dengan<
.<root>....
seperti:SELECT CAST(@MyLongString AS XML)
SELECT @MyLongString AS [processing-instruction(x)] FOR XML PATH('')
. String akan dibungkus dalam PI yang disebut "x", tetapi PI tidak akan dibungkus dengan elemen lain (karenaPATH('')
).Berikut adalah cara melakukannya:
Diambil dari http://ask.sqlservercentral.com/questions/3102/any-way-around-the-print-limit-of-nvarcharmax-in-s.html
sumber
Menemukan pertanyaan ini dan menginginkan sesuatu yang lebih sederhana ... Coba yang berikut ini:
sumber
SELECT CAST(@STMT AS XML)
seperti yang telah dinyatakan dalam komentar lain. Menghasilkan keluaran yang persis sama dan memang tidak serumit membuat prosedur tersimpan untuk keluaran.Proc ini dengan benar mencetak
VARCHAR(MAX)
parameter mempertimbangkan pembungkus:sumber
Saya ingin menggunakan pernyataan print untuk men-debug beberapa sql dinamis karena saya membayangkan sebagian besar dari Anda menggunakan print untuk alasan yang sama.
Saya mencoba beberapa solusi yang terdaftar dan menemukan bahwa solusi Kelsey bekerja dengan tweeks kecil (@sql adalah @script saya) nb PANJANG bukanlah fungsi yang valid:
Kode ini berfungsi seperti yang dikomentari, menambahkan baris baru ke dalam output, tetapi untuk debugging ini bukan masalah bagi saya.
Solusi Ben B sempurna dan paling elegan, meskipun untuk debugging ada banyak baris kode jadi saya memilih untuk menggunakan sedikit modifikasi Kelsey. Mungkin layak untuk membuat sistem seperti prosedur tersimpan di msdb untuk kode Ben B yang dapat digunakan kembali dan dipanggil dalam satu baris?
Sayangnya kode Alfoks tidak berfungsi karena itu akan lebih mudah.
sumber
Anda bisa menggunakan ini
sumber
Saya baru saja membuat SP dari jawaban hebat Ben :
sumber
sumber
Ada fungsi hebat bernama PrintMax yang ditulis oleh Bennett Dill .
Berikut adalah versi yang sedikit dimodifikasi yang menggunakan prosedur tersimpan temp untuk menghindari "polusi skema" (ide dari https://github.com/Toolien/sp_GenMerge/blob/master/sp_GenMerge.sql )
Demo DBFiddle
EDIT:
Menggunakan
CREATE OR ALTER
kami dapat menghindari dua panggilan EXEC:db <> biola Demo
sumber
Menggunakan Line Feed dan spasi sebagai break point yang baik:
sumber
Atau sederhananya:
sumber
Ini versi lain. Yang ini mengekstrak setiap substring untuk dicetak dari string utama daripada mengurangi string utama sebanyak 4000 pada setiap loop (yang mungkin membuat banyak string sangat panjang di bawah kap - tidak yakin).
sumber
Ini harus berfungsi dengan baik ini hanya perbaikan dari jawaban sebelumnya.
sumber
Jika kode sumber tidak memiliki masalah dengan LF yang akan diganti oleh CRLF, Tidak diperlukan debugging dengan mengikuti keluaran kode sederhana.
sumber
Versi PrintMax saya untuk mencegah jeda baris yang buruk pada keluaran:
sumber