2009-04-02 22 views
167

Durante il controllo del codice sul Web e degli script generati da SQL Server Management Studio, ho notato che alcune istruzioni terminano con un punto e virgola.Quando dovrei usare il punto e virgola in SQL Server?

Quindi quando dovrei usarlo?

+20

** SQL Server 2008 R2 ** http://msdn.microsoft.com/en-us/library/ms177563.aspx "Convenzioni sintassi Transact-SQL (Transact-SQL)" **; ** == Terminatore di istruzioni Transact-SQL. Sebbene il punto e virgola non sia richiesto per la maggior parte delle istruzioni in ** questa versione ** di SQL Server, * sarà richiesto in una versione futura *. – gerryLowry

risposta

121

Da uno SQLServerCentral.Com article da Ken Powers:

il punto e virgola

Il carattere punto e virgola è un terminatore dichiarazione. Fa parte dello standard ANSI SQL-92, ma non è mai stato utilizzato in Transact-SQL. In effetti, è stato possibile codificare T-SQL per anni senza mai incontrare un punto e virgola.

Uso

Ci sono due situazioni in cui è necessario utilizzare il punto e virgola. La prima situazione è dove si utilizza una Common Table Expression (CTE) e il CTE non è la prima dichiarazione nel batch. Il secondo è dove si rilascia una dichiarazione di Service Broker e l'istruzione di Service Broker non è la prima dichiarazione nel batch.

+7

È 'THROW' un'istruzione di Service Broker?Abbiamo bisogno di includere un punto e virgola prima di un lancio in questo esempio: 'BEGIN; THROW @Error, 'Invalid FundingID', 2; RETURN \t END' –

+0

Sembra che sia fondamentalmente incoraggiante l'uso del punto e virgola in generale, richiedendolo prima di tutti i nuovi tipi di istruzione introdotti negli ultimi anni. ('MERGE' anche per esempio). Come menzionato in altre risposte, nello standard ANSI sono richieste –

+2

@maurocam Penso che tu abbia letto il documento in modo errato. Se guardi il link, dice "** Non ** terminando le istruzioni Transact-SQL con un punto e virgola". è deprecato. – Caltor

61

Per impostazione predefinita, le istruzioni SQL vengono terminate con il punto e virgola. Si utilizza un punto e virgola per terminare le istruzioni a meno che non si abbia (raramente) impostato un nuovo terminatore di istruzione.

Se si invia solo una dichiarazione, tecnicamente è possibile fare a meno del terminatore dell'istruzione; in uno script, poiché stai inviando più di una dichiarazione, ne hai bisogno.

In pratica, includere sempre il terminatore anche se si sta inviando una sola istruzione al database.

Modifica: in risposta a tali affermazioni, i terminatori dell'istruzione non sono richiesti da [particolare RDBMS], mentre ciò può essere vero, sono richiesti dallo standard ANSI SQL. In tutte le programmazioni, se possiamo aderire a uno standard senza perdita di funzionalità, dovremmo, perché né il nostro codice né le nostre abitudini sono legate a un unico fornitore proprietario.

Con alcuni compilatori C, è possibile avere il reso principale vuoto, anche se lo standard richiede che main ritorni int. Ma fare così rende il nostro codice, e noi stessi, meno portabili.

La più grande difficoltà nella programmazione efficace non è l'apprendimento di nuove cose, è disimparare le cattive abitudini. Nella misura in cui possiamo evitare di acquisire cattive abitudini, in primo luogo, è una vittoria per noi, per il nostro codice e per chiunque stia leggendo o utilizzando il nostro codice.

+1

Questo non è corretto quando si dice che è necessario un punto e virgola quando si inviano più istruzioni. – TheTXI

7

Pareri personali: Utilizzali solo dove sono richiesti. (Veda la risposta di TheTXI sopra per l'elenco richiesto.)

Dal momento che il compilatore non richiede loro, è possibile metterli in tutto, ma perché? Il compilatore non ti dirà dove ne hai dimenticato uno, quindi finirai con l'uso incoerente.

[Questo parere è specifico per SQL Server. Altri database potrebbero avere requisiti più stringenti. Se stai scrivendo SQL per l'esecuzione su più database, i tuoi requisiti potrebbero variare.]

tpdi dichiarato sopra, "in uno script, poiché stai inviando più di una dichiarazione, ne hai bisogno." Questo in realtà non è corretto. Non hai bisogno di loro.

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

uscita:

Semicolons are optional 
Semicolons are optional 
Semicolons are optional 
Semicolons are optional 
+1

Cosa ne pensi di questa discussione? http://www.sqlservercentral.com/Forums/Topic636549-8-1.aspx (Yoy può utilizzare [email protected]: bugmenot se non si dispone di un account) –

+0

Apprezzo che hai affermato chiaramente che questo è solo la tua opinione, tuttavia non penso che sia una buona risposta perché è in conflitto sia con la documentazione Microsoft che con lo standard ANSI. Penserei che questa opinione sarebbe meglio in un commento. (Non provando a picchiarti, hai totalmente diritto alle tue opinioni sull'uso dei semi-punti!) – izzy

1

Sembra che il punto e virgola dovrebbe non utilizzare insieme alle operazioni del cursore: OPEN, FETCH, CLOSE e DEALLOCATE. Ho solo perso un paio d'ore con questo. Ho dato uno sguardo da vicino al BOL e ho notato che [;] non è mostrato nella sintassi per queste istruzioni del cursore !!

Così ho avuto: OPEN mycursor; e questo mi ha dato l'errore 16916.

Ma: OPEN mycursor lavorato.

+1

Non penso che sia corretto. Il BOL non è molto coerente nel menzionare il punto e virgola nella sintassi dell'istruzione, dare un'occhiata alla SELECT per esempio. Inoltre, ho visto OPEN di alcuniCursore; funziona bene, lo stesso per FETCH, CLOSE e DEALLOCATE ... –

0

Quando si utilizza un'istruzione DISABLE o ENABLE TRIGGER in un batch che contiene altre istruzioni in esso, l'istruzione immediatamente prima deve terminare con un punto e virgola. Altrimenti, riceverai un errore di sintassi. Mi sono strappato i capelli con questo ... E in seguito, sono incappato in questo articolo di MS Connect sulla stessa cosa. È chiuso come non risolverà.

vedere here

20

Se leggo correttamente questo, sarà un obbligo di utilizzare il punto e virgola per terminare istruzioni TSQL. http://msdn.microsoft.com/en-us/library/ms143729%28v=sql.120%29.aspx

EDIT: Ho trovato un plug-in per SQL Server Management Studio 2008R2 che formattare lo script e aggiungere i punti e virgola. Penso che sia ancora in beta anche se ...

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

EDIT: Ho trovato un ancora migliore strumento gratuito/plugin chiamato ApexSQL ... http://www.apexsql.com/

+1

http://www.tsqltidy.com non sembra più esistere. –

0

e virgola non funzionano sempre in compound SELECT istruzioni.

Confrontare queste due diverse versioni di un'istruzione SELECT banale composta.

Il codice

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

restituisce

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

Tuttavia, il codice

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

rendimenti

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

(1 row(s) affected) 
+8

[Un anno dopo]: Wow I am surprized nessuno ha ancora commentato questa risposta! Ovviamente non funziona, i punti e virgola sono separatori di istruzioni, quindi il tuo codice con il punto e virgola è: 1- SELECT @ Test = (SELEZIONA (SELEZIONA (SELEZIONA 'I punti e virgola non funzionano sempre bene'; una dichiarazione corretta 2-); - né questo è 3-); - né quello 4-); - né quello il punto e virgola dovrebbe essere dopo la parentesi 3 – PhpLou

11

È usarlo.

La pratica dell'utilizzo di un punto e virgola per terminare le istruzioni è standard e in effetti è un requisito in diverse altre piattaforme di database. SQL Server richiede il punto e virgola solo in determinati casi , ma nei casi in cui non è richiesto un punto e virgola, l'utilizzo di uno non causa problemi. Consiglio vivamente di adottare la pratica di terminare tutte le istruzioni con un punto e virgola. Questo non solo migliorerà la leggibilità del tuo codice, ma in alcuni casi lo può fare con lo . (Quando è necessario un punto e virgola e non è specificato, la SQL messaggio di errore Server produce non è sempre molto chiaro.)

E, cosa più importante:

La documentazione di SQL Server indica che non chiude T -SQL dichiarazioni con un punto e virgola è una funzione deprecata. Ciò significa che l'obiettivo a lungo termine è quello di imporre l'uso di del punto e virgola in una versione futura del prodotto. Questo è un motivo in più per entrare nell'abitudine di di terminare tutte le tue dichiarazioni, anche dove attualmente non è richiesto.

Fonte

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


Un esempio del perché si sempre necessario utilizzare ; sono le seguenti due query (copiati da questo post):

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

enter image description here

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

enter image description here

+3

Questo sembra essere un argomento forte che tu * dovresti * usare il punto e virgola (sostenuto dalle virgolette), ma solo un singolo caso in cui vi è un * deve *. – Gregor

+2

@Gregor, se viene annunciato che l'uso del punto e virgola è un must e 'non usarli 'è una tecnica deprecata che dovresti usarli. In caso contrario, c'è il rischio di soffrire in futuro. Se non hai intenzione di aggiornare/cambiare lavoro e lavorare sempre con SQL Server 2000 sei sicuro :-) – gotqn

+3

Giusto, * dovrei *, sono d'accordo. Ma la prima riga di una risposta enfatizza ** deve **, che non è il caso --- almeno non ancora. – Gregor

2

ho ancora ho molto da imparare su T-SQL, ma lavorando su codice per una transazione (e basando il codice su esempi da stackoverflow e altri siti) ho trovato un caso in cui sembra che sia richiesto un punto e virgola e se manca, l'istruzione non sembra essere eseguita a tutti e nessun errore è sollevato. Questo non sembra essere coperto in nessuna delle risposte di cui sopra. (Stava usando MS SQL Server 2012.)

Una volta che la transazione ha funzionato come volevo, ho deciso di provare a capirlo, quindi se ci sono degli errori, viene ripristinata.Solo dopo aver fatto questo, la transazione non è stata commessa (SQL Server Management Studio conferma quando si cerca di chiudere la finestra con un bel messaggio che avvisa del fatto che v'è una transazione senza commit.

Quindi questo

COMMIT TRANSACTION 

fuori un BEGIN TRY blocco/END TRY funzionato bene per il commit della transazione, ma all'interno del blocco doveva essere

COMMIT TRANSACTION; 

Nota non v'è alcun errore o avviso previsto e nessuna indicazione che la transazione è non impegnati fino tentativo di chiudere il que scheda

Fortunatamente questo causa un problema così grande che è immediatamente evidente che c'è un problema. Sfortunatamente, poiché non viene segnalato alcun errore (sintassi o altro), non è stato immediatamente evidente quale fosse il problema.

Contrario-saggio, ROLLBACK TRANSACTION sembra funzionare altrettanto bene nel blocco BEGIN CATCH con o senza punto e virgola.

Potrebbe esserci qualche logica, ma sembra arbitraria e Alice nel Paese delle Meraviglie.

0

Nota: questo risponde alla domanda come scritta, ma non al problema come indicato. L'aggiunta di qui, dal momento che le persone saranno alla ricerca di esso

Punto e virgola è utilizzato anche prima di WITH nelle dichiarazioni CTE ricorsive:

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

Questa query genererà un CTE numeri chiamati composta da numeri interi [1 .. 10]. E 'fatto con la creazione di un tavolo con il valore 1 solo, e poi recursing fino a raggiungere 10.

+7

Tecnicamente non "prima con", ma dopo quello che viene prima. Se with è la prima dichiarazione nel batch, non è richiesto alcun punto e virgola. –

2

Secondo Transact-SQL Syntax Conventions (Transact-SQL) (MSDN)

Transact-SQL dichiarazione terminatore. Sebbene il punto e virgola non sia richiesto per la maggior parte delle istruzioni in questa versione di SQL Server, sarà necessario in una versione futura.

(vedi anche commento @gerryLowry s')

0

Se come ottenere casuali Command timeout errori in SQLServer poi lasciare fuori il punto e virgola alla fine delle corde CommandText.

Non so se questo è documentato ovunque o se si tratta di un bug, ma succede e l'ho imparato da un'esperienza amara.

devo esempi verificabili e riproducibili tramite SQLServer 2008.

aka ->In pratica, includono sempre il terminatore, anche se sei solo l'invio di un comunicato al database.

Problemi correlati