SQL Server / T-SQL uzun dizeleri ayırmak için satır devamını destekliyor mu?


13

Bazen bir veya daha fazla süper uzun (bazen bile aptal-uzun) dizeleri olan bir SQL komut dosyası var. Genellikle bunlar, VARBINARYdosyaları / Montajları temsil eden değişmez değerler / sabitlerdir, ancak bazen metindir.

Gerçekten uzun dizelerle ilgili temel sorun, bazı metin editörlerinin bunları iyi idare etmemesidir. Örneğin, VARBINARYbir CREATE ASSEMBLY [AssemblyName] FROM 0x....deyimde kullandığım bir gerçek bilgim var ve Meclisin kendisi 1 MB'ın biraz üzerinde, bu da her bir baytın onaltılık gösterimde iki karakter gösterilmesini gerektirdiği için bir metin dosyasında 2 milyondan fazla karaktere eşit (örneğin 0x1F= a 1ve an F). SQL Server Management Studio (SSMS) bu iyi işlemez ve ben bu satır üzerinde kaydırmaya çalışırken birkaç saniye boyunca asılı kalır. Aslında, bazı sürümler (bunun hala devam edip etmediğinden emin değilsiniz), belirli bir uzunluk boyunca en az bir satırı olan bir komut dosyasını açarken uzun satırlarla ilgili bir uyarı bile görüntüler.

İkincil bir sorun, sözcük kaydırma özelliği etkin olmayan bir düzenleyicide kullanırken veya çevrimiçi yayın yaparken biçimlendirmeyi zorlaştırmasıdır. Buradaki sorun, yatay kaydırma çubuğu kaydırıcısının çok dar olması ve biraz hareket ettirilmesi genellikle süper uzun olmayan metni görünmez hale getirmesidir.

Şimdi, T-SQL, yeni satırlarla veya hatta noktalı virgüllerle komutları sonlandırmıyor (SQL Server 2005'ten başlayarak yarı sütunlar tercih edilir / önerilir). SQL Server ne zaman biteceğini bildiği şekilde her bir ifadeyi ayrıştırmak bilen Yani bu yana, sadece bir ayırarak, bölme gibi çoklu hatları üzerinden uzun bir çizgi gibi görünüyor newline/ carriage-return+ line-feed, mantıksız görünmüyor. Ancak bu her iki durumda da çalışmaz.

PRINT 'Line1
Line2';

döner ("Mesajlar" sekmesinde):

Line1
Line2

Ve bu satırsonu bir değişmez / sabit içinde olduğu için yeterince mantıklı. Ama bunu bir için yapmak VARBINARYda işe yaramaz.

PRINT 0x1234
5678;

bana bir hata veriyor.

Yanıtlar:


13

Neyse ki \(ters eğik çizgi) karakteriyle T-SQL'de satır devam etme desteği var . Bir satırın sonunda, hemen önce bu sadece bir yer newline/ carriage-return+ line-feedve yeni satır yok sayılacak.

Metin dizeleri için bu şu şekilde davranır:

PRINT 'Line1\
Line2';

döner ("Mesajlar" sekmesinde):

Line1Line2

İkili / onaltılık dizeler için bu aşağıdaki gibi davranır:

PRINT 0x1234\
5678;

döner ("Mesajlar" sekmesinde):

0x12345678;

İkili dosyaları (Montajlar, Sertifikalar) SQL komut dosyalarında kullanılmak üzere metin onaltılık bayt dizeleri olarak biçimlendirmek için GitHub'da açık kaynak olarak yayınladığım BinaryFormatter adlı bir komut satırı yardımcı programı yazdım . İkili dosyayı bir metin temsiline dönüştürmekle kalmaz, aynı zamanda VARBINARYher bir satır için kullanılacak karakter sayısına göre uzun değişmezleri gereken sayıda satıra yaymak için satır devamını kullanır . Sonuç, aşağıdaki satırlarda bir şeydir:

4D5A09DE34F178313345A4\
00007F4E39782EFC48D842\
00000000

daha sonra {...}aşağıdaki alanda gösterildiği gibi kopyalayıp yapıştırabilirim :

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

Bu konuyla ilgili ek ayrıntılar için lütfen blog gönderime bakın: T-SQL'de Line-Continuation

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.