Quand dois-je utiliser des points-virgules dans SQL Server?

En vérifiant du code sur le web et des scripts générés par SQL Server Management Studio, j'ai remarqué que certaines instructions se terminent par un point-virgule.

Alors quand devrais-je l'utiliser?

176
demandé sur gotqn 2009-04-02 21:11:38

13 réponses

Depuis un SQLServerCentral.Com article par Ken Powers:

Le Point-Virgule

Le point-virgule est un terminateur d'instruction. Il fait partie de la norme ANSI SQL-92, mais n'a jamais été utilisé dans Transact-SQL. En effet, il était possible de coder T-SQL pendant des années sans jamais rencontrer de point-virgule.

L'Utilisation de

Il y a deux situations dans lesquelles vous devez utiliser le point-virgule. La première situation est où vous utilisez une Expression de Table commune (CTE), et le CTE n'est pas la première instruction du lot. La seconde est l'endroit où vous émettez une déclaration de courtier de Service et la déclaration de courtier de Service n'est pas la première déclaration du lot.

125
répondu TheTXI 2012-05-09 15:40:46

Par défaut, les instructions SQL sont terminées par des points-virgules. Vous utilisez un point-virgule pour terminer les instructions sauf si vous avez (rarement) défini un nouveau terminateur d'instruction.

Si vous n'envoyez qu'une seule instruction, techniquement vous pouvez vous passer du terminateur d'instruction; dans un script, comme vous envoyez plus d'une instruction, vous en avez besoin.

En pratique, incluez toujours le terminateur même si vous n'envoyez qu'une instruction à la base de données.

Edit: en réponse à ceux dire que les terminateurs d'instructions ne sont pas requis par [SGBDR particulier], bien que cela puisse être vrai, ils sont requis par la norme ANSI SQL. Dans toute la programmation, si nous pouvons adhérer à une norme sans perte de fonctionnalité, nous devrions, car alors ni notre code ni nos habitudes ne sont liés à un fournisseur propriétaire.

Avec certains compilateurs C, il est possible d'avoir main return void, même si la norme nécessite main pour retourner int. Mais cela rend notre code, et nous-mêmes, moins portable.

La plus grande difficulté à programmer efficacement n'est pas d'apprendre de nouvelles choses, c'est de désapprendre les mauvaises habitudes. Dans la mesure où nous pouvons éviter d'acquérir de mauvaises habitudes en premier lieu, c'est une victoire pour nous, pour notre code, et pour quiconque lit ou utilise notre code.

67
répondu tpdi 2009-04-02 18:33:12

Dans SQL2008 BOL, ils disent que dans les prochaines versions, des points-virgules seront nécessaires. Par conséquent, utilisez-le toujours.

Référence:

23
répondu GSerg 2012-05-25 13:10:17

Si je lis ceci correctement, il sera nécessaire d'utiliser des points-virgules pour mettre fin aux instructions TSQL. http://msdn.microsoft.com/en-us/library/ms143729%28v=sql.120%29.aspx

Modifier: J'ai trouvé un plug-in pour SSMS 2008R2 qui formatera votre script et ajoutera les points-virgules. Je pense qu'il est encore en version bêta si...

Http://www.tsqltidy.com/tsqltidySSMSAddin.aspx

Modifier: J'ai trouvé un outil/plugin gratuit encore meilleur appelé ApexSQL... http://www.apexsql.com/

22
répondu Spidermain50 2014-05-01 21:54:13

Vous doit utiliser.

La pratique d'utiliser un point-virgule pour terminer les instructions est standard et est en fait une exigence dans plusieurs autres plates-formes de base de données. SQL Server nécessite le point virgule seulement en particulier cas - mais dans les cas où un point-virgule n'est pas nécessaire, l'utilisation d'un point-virgule ne pose pas de problèmes. Je vous recommande fortement d'adopter la pratique consistant à terminer toutes les déclarations par un point-virgule. Non seulement cela améliorera le la lisibilité de votre code, mais dans certains cas, il peut vous épargner un peu de chagrin. (Lorsqu'un point-virgule est requis et n'est pas spécifié, le message D'erreur SQL Serveur produit n'est pas toujours très claire.)

Et le plus important:

La documentation SQL Server indique que ne pas terminer les instructions T-SQL avec un point-virgule est une caractéristique obsolète. Cela signifie que l'objectif à long terme est de faire respecter l'utilisation du point-virgule dans une future version du produit. C'est une raison de plus pour entrer dans le habitude de mettre fin à toutes vos déclarations, même si ce n'est actuellement pas nécessaire.

Source: Microsoft SQL Server 2012 T-SQL Fundamentals par Itzik Ben-Gan.


Un exemple de pourquoi vous devez toujours utiliser ; sont les deux requêtes suivantes (copiées à partir de ce message ):

BEGIN TRY
    BEGIN TRAN
    SELECT 1/0 AS CauseAnException
    COMMIT
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE()
    THROW
END CATCH

entrez la description de l'image ici

BEGIN TRY
    BEGIN TRAN
    SELECT 1/0 AS CauseAnException;
    COMMIT
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE();
    THROW
END CATCH

entrez la description de l'image ici

12
répondu gotqn 2017-06-16 11:03:46

Opinion personnelle: N'utilisez-les que là où elles sont nécessaires. (Voir la réponse de TheTXI ci-dessus pour la liste requise.)

Puisque le compilateur n'en a pas besoin, vous pouvez les mettre partout, mais pourquoi? Le compilateur ne vous dira pas où vous en avez oublié un, donc vous finirez avec une utilisation incohérente.

[cette opinion est spécifique à SQL Server. D'autres bases de données peuvent avoir des exigences plus strictes. Si vous écrivez SQL pour l'exécuter sur plusieurs bases de données, vos besoins peuvent varier.]

Tpdi a déclaré ci-dessus, "dans un script, comme vous envoyez plus d'une instruction, vous en avez besoin."Ce n'est pas vraiment correct. Vous n'en avez pas besoin.

PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional';
PRINT 'Semicolons are optional';

Sortie:

Semicolons are optional
Semicolons are optional
Semicolons are optional
Semicolons are optional
9
répondu Rob Garrison 2009-04-02 17:27:01

J'ai encore beaucoup à apprendre sur T-SQL, mais en travaillant du code pour une transaction (et en basant le code sur des exemples de stackoverflow et d'autres sites), j'ai trouvé un cas où il semble qu'un point-virgule soit requis et s'il est manquant, l'instruction ne semble pas s'exécuter du tout et aucune erreur Cela ne semble pas être couvert dans l'une des réponses ci-dessus. (Cela utilisait MS SQL Server 2012.)

Une fois que j'ai fait fonctionner la transaction comme je le voulais, j'ai décidé de mettre un try-catch autour de lui, donc s'il y a des erreurs, il est annulé. Ce n'est qu'après cela que la transaction n'a pas été validée (SSMS le confirme en essayant de fermer la fenêtre avec un joli message vous avertissant du fait qu'il existe une transaction non validée.

Donc ceci

COMMIT TRANSACTION 

En dehors D'un bloc BEGIN TRY/END TRY a bien fonctionné pour valider la transaction, mais à l'intérieur du bloc, il devait être

COMMIT TRANSACTION;

Note il n'y a aucune erreur ou avertissement fourni et aucune indication que le la transaction n'est toujours pas validée jusqu'à la tentative de fermeture de l'onglet requête.

Heureusement, cela provoque un énorme problème qu'il est immédiatement évident qu'il y a un problème. Malheureusement, comme aucune erreur (syntaxe ou autre) n'est signalée, le problème n'était pas immédiatement évident.

Au contraire, la TRANSACTION de restauration semble fonctionner aussi bien dans le bloc begin CATCH avec ou sans point-virgule.

Il peut y avoir une certaine logique à cela, mais il se sent arbitraire et Alice au pays des Merveilles-ish.

2
répondu Matthew Davidian 2015-06-11 19:57:52

Selon les Conventions de syntaxe Transact-SQL (Transact-SQL) (MSDN)

Transact-terminateur d'instruction SQL. Bien que le point-virgule ne soit pas requis pour la plupart des instructions de cette version de SQL Server, il le sera dans une version future.

(Voir Aussi Le Commentaire de @gerrylowry)

2
répondu Alan B 2015-08-26 08:33:37

Il semble que les points-virgules ne doivent pas être utilisés conjointement avec les opérations de curseur: OPEN, FETCH, CLOSE et DEALLOCATE. Je viens de perdre une couple d'heures avec ce. J'ai regardé de près le BOL et j'ai remarqué que [;] n'est pas montré dans la syntaxe pour ces instructions de curseur!!

Donc j'ai eu: Ouvrir mycursor; et cela m'a donné l'erreur 16916.

Mais: Ouvrir mycursor travaillé.

1
répondu rab 2009-09-23 06:37:09

Les points-virgules ne fonctionnent pas toujours dans les instructions SELECT composées.

Comparez ces deux versions différentes d'une instruction SELECT compound trivial.

Le code

DECLARE @Test varchar(35); 
SELECT @Test=
    (SELECT 
        (SELECT 
            (SELECT 'Semicolons do not always work fine.';););); 
SELECT @Test Test;

Renvoie

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ';'.

Cependant, le code

DECLARE @Test varchar(35)
SELECT @Test=
    (SELECT 
        (SELECT 
            (SELECT 'Semicolons do not always work fine.'))) 
SELECT @Test Test

Renvoie

Test
-----------------------------------
Semicolons do not always work fine.

(1 row(s) affected)
1
répondu John Feild 2014-10-03 06:26:28

Lorsque vous utilisez une instruction DISABLE ou ENABLE TRIGGER dans un lot contenant d'autres instructions, l'instruction juste avant doit se terminer par un point-virgule. Sinon, vous obtiendrez une erreur de syntaxe. Je me suis déchiré les cheveux avec celui-ci... Et après, je suis tombé sur cet article MS Connect à peu près la même chose. Il est fermé comme ne corrigera pas.

Voir ici

0
répondu Nick V 2012-10-04 08:47:33

Remarque: cela répond à la question comme écrit, mais pas au problème comme indiqué. En l'ajoutant ici, puisque les gens vont le chercher

Le point-virgule est également utilisé avant WITH dans les instructions CTE récursives:

;WITH Numbers AS
(
    SELECT n = 1
    UNION ALL
    SELECT n + 1
    FROM Numbers
    WHERE n+1 <= 10
)
SELECT n
FROM Numbers

Cette requête va générer un CTE appelé Numbers qui se compose d'entiers [1..10]. Cela se fait en créant une table avec la valeur 1 seulement, puis en réapparaissant jusqu'à ce que vous atteigniez 10.

0
répondu v010dya 2015-07-31 09:11:37

Si vous aimez obtenir des erreurs aléatoires Command Timeout dans SQLServer, laissez le point-virgule à la fin de vos chaînes CommandText.

Je ne sais pas si cela est documenté n'importe où ou s'il s'agit d'un bug, mais cela arrive et j'ai appris cela par expérience amère.

J'ai des exemples vérifiables et reproductibles en utilisant SQLServer 2008.

Aka - > en pratique, incluez toujours le terminateur même si vous envoyez juste une instruction au la base de données.

0
répondu Allan Maher 2015-10-04 03:11:08