Apakah SQL Server / T-SQL mendukung garis-kelanjutan untuk memecah string panjang?

13

Saya kadang-kadang memiliki skrip SQL yang memiliki satu atau lebih string super-panjang (kadang-kadang bahkan bodoh-panjang). Biasanya ini adalah VARBINARYliteral / konstanta yang mewakili file / Majelis, tetapi kadang-kadang mereka adalah teks.

Masalah utama dengan string yang sangat panjang adalah bahwa beberapa editor teks tidak menangani semuanya dengan baik. Misalnya, saya memiliki VARBINARYliteral yang saya gunakan dalam CREATE ASSEMBLY [AssemblyName] FROM 0x....pernyataan, dan Majelis itu sendiri berukuran lebih dari 1 MB, yang setara dengan lebih dari 2 juta karakter dalam file teks karena setiap byte membutuhkan dua karakter untuk diwakili dalam notasi hex (misalnya 0x1F= a 1dan an F). SQL Server Management Studio (SSMS) tidak menangani ini dengan baik dan hang selama beberapa detik ketika saya mencoba untuk menggulir ke baris itu. Dan pada kenyataannya, beberapa versi (tidak yakin apakah ini masih terjadi) bahkan akan menampilkan peringatan tentang garis panjang ketika membuka skrip yang memiliki setidaknya satu baris pada panjang tertentu.

Masalah kedua adalah bahwa hal itu mempersulit pemformatan ketika menggunakan editor tanpa mengaktifkan kata-bungkus, atau memposting secara online. Masalahnya di sini adalah bahwa slider untuk scroll bar horisontal sangat sempit dan memindahkannya walaupun hanya sedikit biasanya menggulirkan teks yang tidak terlalu panjang ke luar dari tampilan.

Sekarang, T-SQL tidak menghentikan perintah dengan baris baru atau bahkan semi-titik dua (meskipun semi-titik dua lebih disukai / direkomendasikan, dimulai dengan SQL Server 2005). Jadi sejak SQL Server tahu bagaimana mengurai setiap pernyataan seperti yang ia tahu ketika itu berakhir, tampaknya seperti membelah garis panjang di beberapa baris, dipisahkan oleh sebuah newline/ carriage-return+ line-feed, tampaknya tidak masuk akal. Tapi ini tidak berhasil dalam kedua kasus itu.

PRINT 'Line1
Line2';

kembali (di tab "Pesan"):

Line1
Line2

Dan itu cukup masuk akal karena baris baru dalam literal / konstan. Tetapi melakukan ini VARBINARYjuga tidak berhasil.

PRINT 0x1234
5678;

memberi saya kesalahan.

Solomon Rutzky
sumber

Jawaban:

13

Untungnya ada dukungan untuk garis-kelanjutan dalam T-SQL melalui karakter \(backslash). Cukup tempatkan di akhir baris, tepat sebelum newline/ carriage-return+ line-feed, dan baris baru akan diabaikan.

Untuk string teks, ini berperilaku sebagai berikut:

PRINT 'Line1\
Line2';

kembali (di tab "Pesan"):

Line1Line2

Untuk string biner / hex, ini berperilaku sebagai berikut:

PRINT 0x1234\
5678;

kembali (di tab "Pesan"):

0x12345678;

Untuk memformat file biner (Assemblies, Certificates) menjadi string hex-byte teks untuk digunakan dalam skrip SQL, saya menulis sebuah utilitas command-line bernama BinaryFormatter yang telah saya rilis sebagai open-source di GitHub. Tidak hanya mengkonversi file biner menjadi representasi teks, tetapi juga menggunakan garis-kelanjutan untuk menyebarkan VARBINARYliteral panjang di banyak baris yang dibutuhkan, berdasarkan jumlah karakter yang ditentukan untuk digunakan per setiap baris. Hasilnya adalah sesuatu di sepanjang baris:

4D5A09DE34F178313345A4\
00007F4E39782EFC48D842\
00000000

yang kemudian saya salin dan tempel ke skrip saya, seperti yang ditunjukkan pada {...}area di bawah ini:

CREATE ASSEMBLY [AssemblyName]
FROM 0x\
{output from BinaryFormatter}
;

Untuk detail tambahan tentang topik ini, silakan lihat posting blog saya: Line-Continuation in T-SQL

Solomon Rutzky
sumber