par , 14/08/2018 à 17h33 (7019 Affichages)
Je me suis toujours posé la question concernant la nécessité d'ajouter un ";" (point-virgule) à la fin de certaines instructions T-SQL.
Et, force est de constater que la réponse n'est pas toujours évidente. Le manque de rigueur du langage T-SQL contribue, à mon avis, à cette confusion !
Pendant longtemps et même jusqu'à aujourd'hui, sauf dans de rares cas (Exemple ";WITH CTE ..." ) , l'ajout du point-virgule n'est pas vraiment indispensable pour que le code T-SQL compile correctement, en ce sens qu'aucun message d'erreur ou d'avertissement n'est généré si on omet les points virgules à la fin des instructions.
Ayant développé dans d'autres langages plus stricts, personnellement, je me force d'être également plus rigoureux avec le langage T-SQL et je rajoute systématiquement des points virgules à la fin des instructions T-SQL, même si parfois j'avais quelques doutes ou questions quant à l'utilisation du point-virgule ! J'ai fini par trancher ces doutes et questions (Voir plus loin dans cet article).
Exemple de questions :
- Fallait-il vraiment un point-virgule après un BEGIN ?
Remarque :
"BEGIN;" me paraissait tellement "moche" que personnellement, je n'ai jamais mis de point-virgule après un "BEGIN"
En plus, je n'ai jamais vu d'exemple T-SQL où on peut voir un "BEGIN;" ! Pour moi, cette question a été vite tranchée.
En faisant quelques recherches sur ce sujet, il semble que "BEGIN;" est équivalent à un "BEGIN" suivi d'une instruction vide qui ne sert à rien !
- Fallait-il vraiment un point-virgule après un END ?
1 2
| BEGIN -- avec ou sans point-virgule !
END; |
Remarque :
Là, franchement, j'hésitais (?). En effet, on peut, trouver des exemples dans Le BOL avec des "END;" et d'autre avec "END" sans le ";" (point-virgule).
Exemple :
Syntaxe extraite du BOL, sans le point-virgule :
1 2 3 4 5 6
|
BEGIN
{
sql_statement | statement_block
}
END |
Exemple extrait du BOL, avec point-virgule :
1 2 3 4
| IF @@TRANCOUNT = 0
BEGIN
...
END; |
Remarque :
On peut aisément constater une incohérence entre la syntaxe et les exemples de "BEGIN .. END" !
- Fallait-il vraiment un point-virgule après un "BGIN TRAN", "BEGIN TRANSACTION", ROLLBACK, ROLLBACK TRANSACTION ?
1 2 3 4 5 6
| BEGIN TRAN;
BEGIN TRANSACTION;
ROLLBACK;
ROLLBACK TRANSACTION;
-- Etc. |
Voilà, autant de questions sujettes à interprétation ou plutôt à "confusion" !
Microsoft, dans le BOL précise désormais ceci :
; Terminateur d'instruction Transact-SQL. Bien que le point-virgule ne soit pas requis pour la plupart des instructions dans cette version de SQL Server, il sera requis dans une version à venir.
Personne ne pourra sérieusement croire que Microsoft osera un jour franchir le pas et rendre le ";" (point-virgule) obligatoire. Le poids du code T-SQL existant est tel que cela "foutrait la pagaille" ! Et beaucoup n'utiliseront peut être jamais les nouvelles versions SQL Server intégrant cette exigence stricte.
En conclusion
Après avoir effectué des recherches sur ce sujet et surtout examiné beaucoup de code T-SQL j'en arrive à la conclusion suivante :
1 - Rajouter un ";" (point-virgule) à la fin de chaque instruction T-SQL, à quelques exceptions près (voir point 2 ci-dessous)
2 - Ne pas rajouter un ";" (point-virgule) après les mots clés suivants :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| BEGIN
IF
ELSE
BEGIN TRY
END TRY
BEGIN CATCH
WHILE
GO |
3 - Rajouter un ";" (point-virgule) à la fin des instructions T-SQL telles que ci-dessous :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| BEGIN TRAN;
BEGIN TRAN Transaction_Name;
BEGIN TRAN Transaction_Name WITH MARK Description;
BEGIN TRANSACTION;
BEGIN TRANSACTION Transaction_Name;
BEGIN TRANSACTION Transaction_Name WITH MARK Description;
COMMIT TRAN;
COMMIT TRAN Transaction_Name;
COMMIT TRANSACTION;
COMMIT TRANSACTION Transaction_Name;
END CATCH;
END;
ROLLBACK;
ROLLBACK TRAN;
ROLLBACK TRAN Transaction_Name;
ROLLBACK TRAN SavePoint_Name;
ROLLBACK TRANSACTION;
ROLLBACK TRANSACTION Transaction_Name;
SAVE TRAN SavePoint_Name;
SAVE TRANSACTION SavePoint_Name;
SAVE TRANSACTION SavePoint_Name;
USE Database_Name; |
4 - Rajouter, le cas échéant, et non pas systématiquement, un ';' (point-virgule) au début des déclarations CTE (Common Table Expression). Dans la pratique, rajouter un ";" (point-virgule) uniquement si vous obtenez des erreurs de syntaxes.
Exemple :
1 2 3 4 5 6 7 8
| ;WITH CTE_Client AS
(SELECT Nom
FROM dbo.Client
WHERE ...
)
SELECT Nom
FROM CTE_Client
WHERE ... |
Remarque :
Le ";" (point-virgule) en début d'une déclaration CTE n'est pas toujours requis. Si par exemple la déclaration CTE est la première instruction de votre bloc T-SQL, le ";" (point-virgule) n'est pas nécessaire en début de la déclaration. En effet, le ";" (point-virgule) est avant tout un "Terminateur" et non un "Démarreur" !
Il se trouve que, pour des raisons diverses (1), l'instruction WITH CTE exige que l'instruction précédente, si elle existe, soit explicitement terminée avec un ";" (point-virgule).
(1) : La raison est que le mot clé WITH est utilisé également dans plusieurs contextes différents (Indicateur de verrou WITH (NOLOCK), Indicateurs divers de requêtes WITH (...) etc. Le fait de marquer, par un ";" (point-virgule) que l'instruction précédente est bien terminée, aide l'Analyseur syntaxique en lui permettant de lever toute ambiguïté et donc ainsi de ne pas générer des messages erreurs.
A+
Hamid MIRA