SQL Server / T-SQL supporta la continuazione di riga per spezzare stringhe lunghe?


13

A volte ho uno script SQL che ha una o più stringhe super-lunghe (a volte anche stupide). In genere si tratta di VARBINARYvalori letterali / costanti che rappresentano file / assiemi, ma a volte sono testo.

Il problema principale con stringhe molto lunghe è che alcuni editor di testo non li gestiscono così bene. Ad esempio, ho un valore VARBINARYletterale che uso in CREATE ASSEMBLY [AssemblyName] FROM 0x....un'istruzione e l'Assemblea stessa ha dimensioni di poco più di 1 MB, il che equivale a poco più di 2 milioni di caratteri in un file di testo poiché ogni byte richiede che due caratteri siano rappresentati in notazione esadecimale (es. 0x1F= a 1e an F). SQL Server Management Studio (SSMS) non lo gestisce bene e si blocca per alcuni secondi mentre provo a scorrere su quella linea. E in effetti, alcune versioni (non sono sicuro che ciò accada ancora) mostreranno anche un avvertimento sulle righe lunghe quando si apre uno script che ha almeno una riga su una certa lunghezza.

Un problema secondario è che complica la formattazione quando si utilizza in un editor senza il ritorno a capo abilitato o la pubblicazione online. Il problema qui è che il cursore per la barra di scorrimento orizzontale è molto stretto e spostandolo anche solo un po 'di solito scorre il testo non molto lungo fuori dalla vista.

Ora, T-SQL non termina i comandi con newline o anche punti e virgola (anche se i punti e virgola sono preferiti / consigliati, a partire da SQL Server 2005). Quindi, poiché SQL Server sa come analizzare ogni istruzione in modo tale che sappia quando finisce, sembra che dividere la linea lunga su più linee, separate solo da un newline/ carriage-return+ line-feed, non sembra irragionevole. Ma questo non funziona in entrambi i casi.

PRINT 'Line1
Line2';

ritorna (nella scheda "Messaggi"):

Line1
Line2

E questo ha abbastanza senso in quanto la newline è all'interno di una costante / letterale. Ma farlo anche per un VARBINARYnon funziona.

PRINT 0x1234
5678;

mi dà un errore.

Risposte:


13

Per fortuna c'è il supporto per la continuazione della linea in T-SQL tramite il carattere \(barra rovesciata). Basta posizionarlo alla fine di una riga, subito prima di newline/ carriage-return+ line-feed, e la nuova riga verrà ignorata.

Per le stringhe di testo, ciò si comporta come segue:

PRINT 'Line1\
Line2';

ritorna (nella scheda "Messaggi"):

Line1Line2

Per stringhe binarie / esadecimali, si comporta come segue:

PRINT 0x1234\
5678;

ritorna (nella scheda "Messaggi"):

0x12345678;

Per formattare i file binari (assembly, certificati) in stringhe di testo esadecimali da utilizzare negli script SQL, ho scritto un'utilità della riga di comando chiamata BinaryFormatter che ho rilasciato come open-source su GitHub. Non solo converte il file binario in una rappresentazione testuale, ma utilizza anche la continuazione di riga per distribuire VARBINARYletterali lunghi su tutte le righe necessarie, in base al numero specificato di caratteri da utilizzare per ogni riga. Il risultato è qualcosa sulla falsariga di:

4D5A09DE34F178313345A4\
00007F4E39782EFC48D842\
00000000

che poi copio e incollo nella mia sceneggiatura, come mostrato {...}nell'area sottostante:

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

Per ulteriori dettagli su questo argomento, vedere il mio post sul blog: Continuazione di riga in T-SQL

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.