Voir le flux RSS

hmira

SQL Server - T-SQL : Le ";" (point-virgule) est-il vraiment nécessaire ?

Noter ce billet
par , 14/08/2018 à 18h33 (3549 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 ?
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
BEGIN
	 {
	sql_statement | statement_block
	 }
END
Exemple extrait du BOL, avec point-virgule :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
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

Envoyer le billet « SQL Server - T-SQL :  Le ";" (point-virgule) est-il vraiment nécessaire ? » dans le blog Viadeo Envoyer le billet « SQL Server - T-SQL :  Le ";" (point-virgule) est-il vraiment nécessaire ? » dans le blog Twitter Envoyer le billet « SQL Server - T-SQL :  Le ";" (point-virgule) est-il vraiment nécessaire ? » dans le blog Google Envoyer le billet « SQL Server - T-SQL :  Le ";" (point-virgule) est-il vraiment nécessaire ? » dans le blog Facebook Envoyer le billet « SQL Server - T-SQL :  Le ";" (point-virgule) est-il vraiment nécessaire ? » dans le blog Digg Envoyer le billet « SQL Server - T-SQL :  Le ";" (point-virgule) est-il vraiment nécessaire ? » dans le blog Delicious Envoyer le billet « SQL Server - T-SQL :  Le ";" (point-virgule) est-il vraiment nécessaire ? » dans le blog MySpace Envoyer le billet « SQL Server - T-SQL :  Le ";" (point-virgule) est-il vraiment nécessaire ? » dans le blog Yahoo

Mis à jour 14/08/2018 à 21h43 par hmira

Tags: sql, sql server, t-sql
Catégories
SQL Server

Commentaires