J'ai parfois un script SQL qui a une ou plusieurs chaînes super longues (parfois même stupides). Ce sont généralement des VARBINARY
littéraux / constantes qui représentent des fichiers / assemblys, mais parfois ce sont du texte.
Le problème principal avec les chaînes très longues est que certains éditeurs de texte ne les gèrent pas très bien. Par exemple, j'ai un VARBINARY
littéral que j'utilise dans une CREATE ASSEMBLY [AssemblyName] FROM 0x....
déclaration, et l'assemblage lui-même fait un peu plus de 1 Mo, ce qui équivaut à un peu plus de 2 millions de caractères dans un fichier texte car chaque octet nécessite que deux caractères soient représentés en notation hexadécimale (par exemple 0x1F
= a 1
et an F
). SQL Server Management Studio (SSMS) ne gère pas bien cela et se bloque pendant plusieurs secondes alors que j'essaie de faire défiler cette ligne. Et en fait, certaines versions (je ne sais pas si cela se produit toujours) afficheront même un avertissement sur les longues lignes lors de l'ouverture d'un script qui a au moins une ligne sur une certaine longueur.
Un problème secondaire est qu'il complique la mise en forme lors de l'utilisation dans un éditeur sans habillage de mots activé ou lors de la publication en ligne. Le problème ici est que le curseur de la barre de défilement horizontale est très étroit et le déplacer ne serait-ce qu'un tout petit peu fait défiler le texte non super long hors de la vue.
Maintenant, T-SQL ne termine pas les commandes avec des retours à la ligne ou même des points-virgules (bien que les points-virgules soient préférés / recommandés, à partir de SQL Server 2005). Donc, puisque SQL Server sait comment analyser chaque instruction de manière à savoir quand elle se termine, il semble que le fractionnement de la longue ligne sur plusieurs lignes, séparées uniquement par un newline/ carriage-return+ line-feed, ne semble pas déraisonnable. Mais cela ne fonctionne pas dans les deux cas.
PRINT 'Line1
Line2';
renvoie (dans l'onglet "Messages"):
Line1
Line2
Et cela est suffisamment logique car la nouvelle ligne est dans un littéral / constant. Mais cela VARBINARY
ne fonctionne pas non plus.
PRINT 0x1234
5678;
me donne une erreur.
la source