¿Cuándo debo usar punto y coma en SQL Server?

221

Al verificar algunos códigos en la web y los scripts generados por SQL Server Management Studio, noté que algunas declaraciones terminan en punto y coma.

Entonces, ¿cuándo debo usarlo?

Anwar Pinto
fuente
23
SQL Server 2008 R2 msdn.microsoft.com/en-us/library/ms177563.aspx "Convenciones de sintaxis de Transact-SQL (Transact-SQL)" ; == Terminador de instrucción Transact-SQL. Aunque el punto y coma no se requiere para la mayoría de las declaraciones en esta versión de SQL Server, se requerirá en una versión futura .
gerryLowry
2
Aunque afirman que se requerirá un punto y coma en una versión futura, esto nunca se hará realidad. Nunca pueden exigir eso por razones de compatibilidad. Rompería aproximadamente el 100% de las aplicaciones.
usr
1
Ahora es 2019 y todavía no se acepta con punto y coma la última versión de SQL Server. Como dice @usr, a menos que Microsoft quiera hacer un corte 100% limpio, no hay forma de que puedan hacer cumplir esto.
Ian Kemp

Respuestas:

152

De un artículo de SQLServerCentral.Com de Ken Powers:

El punto y coma

El carácter de punto y coma es un terminador de declaración. Es parte del estándar ANSI SQL-92, pero nunca se usó dentro de Transact-SQL. De hecho, fue posible codificar T-SQL durante años sin encontrar nunca un punto y coma.

Uso

Hay dos situaciones en las que debe usar el punto y coma. La primera situación es donde utiliza una expresión de tabla común (CTE), y el CTE no es la primera instrucción del lote. El segundo es donde emite una declaración de Service Broker y la declaración de Service Broker no es la primera declaración del lote.

TheTXI
fuente
99
¿Es THROWuna declaración de Service Broker? Necesitamos incluir un punto y coma antes de un lanzamiento en este ejemplo:BEGIN ;THROW @Error, 'Invalid FundingID', 2; RETURN END
Chris Walsh
1
Parece que básicamente están fomentando el uso del punto y coma en general, al requerirlo antes de todos los nuevos tipos de declaraciones que se han introducido en los últimos años. ( MERGEtambién por ejemplo). Como se menciona en otras respuestas, en el estándar ANSI son obligatorios
Mark Sowul
2
@maurocam Creo que has leído el documento incorrectamente. Si observa ese enlace, dice " No finalizar las instrucciones Transact-SQL con un punto y coma". es obsoleto.
Caltor
Tal como lo veo, esto no aborda la cuestión de si se debe (a diferencia de mosto ) utiliza un punto y coma.
Stewart
81

Por defecto, las sentencias SQL terminan con punto y coma. Utiliza un punto y coma para terminar las declaraciones a menos que haya (rara vez) establecido un nuevo terminador de declaraciones.

Si envía una sola declaración, técnicamente puede prescindir del terminador de la declaración; en un script, ya que está enviando más de una declaración, la necesita.

En la práctica, siempre incluya el terminador incluso si solo está enviando una declaración a la base de datos.

Editar: en respuesta a los que dicen que los terminadores de declaraciones no son requeridos por [RDBMS particular], aunque eso puede ser cierto, son requeridos por el Estándar ANSI SQL. En toda la programación, si podemos adherirnos a un Estándar sin pérdida de funcionalidad, deberíamos hacerlo, porque entonces ni nuestro código ni nuestros hábitos están vinculados a un proveedor propietario.

Con algunos compiladores de C, es posible tener main return anular, aunque el estándar requiere que main regrese int. Pero hacerlo hace que nuestro código, y nosotros mismos, sea menos portátil.

La mayor dificultad en la programación efectiva no es aprender cosas nuevas, es desaprender los malos hábitos. En la medida en que podamos evitar adquirir malos hábitos en primer lugar, es una victoria para nosotros, para nuestro código y para cualquiera que lea o use nuestro código.

tpdi
fuente
25

Usted debe usarlo.

La práctica de usar un punto y coma para terminar las declaraciones es estándar y, de hecho, es un requisito en varias otras plataformas de bases de datos. SQL Server requiere el punto y coma solo en casos particulares, pero en los casos en que no se necesita un punto y coma, el uso de uno no causa problemas. Le recomiendo que adopte la práctica de terminar todas las declaraciones con punto y coma. Esto no solo mejorará la legibilidad de su código, sino que en algunos casos puede ahorrarle algo de pena. (Cuando se requiere un punto y coma y no se especifica, el mensaje de error que produce SQL Server no siempre es muy claro).

Y lo más importante:

La documentación de SQL Server indica que no terminar las sentencias T-SQL con un punto y coma es una característica obsoleta. Esto significa que el objetivo a largo plazo es forzar el uso del punto y coma en una versión futura del producto. Esa es una razón más para adquirir el hábito de terminar todas sus declaraciones, incluso donde actualmente no se requiere.

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


Un ejemplo de por qué siempre debe usar ;son las siguientes dos consultas (copiadas de esta publicación ):

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

gotqn
fuente
77
Esto parece ser un fuerte argumento de que debe usar punto y coma (respaldado por las comillas), pero solo un caso en el que hay una necesidad .
Gregor Thomas
3
@ Gregor, si se anuncia que usar puntos y comas es una not using themtécnica obligatoria y obsoleta, debe usarlos. Si no, existe el riesgo de sufrir en el futuro. Si no planea actualizar / cambiar de trabajo y siempre va a trabajar con SQL Server 2000, está seguro :-)
gotqn
55
Bien, debería , estoy de acuerdo. Pero la primera línea de su respuesta enfatiza el mosto , que no es el caso, al menos no todavía.
Gregor Thomas
2
El ejemplo con puntos y comas resulta en Incorrect syntax near 'THROW'.SQL Server 2008 (10.0.6241.0), que es la versión con la que tengo que lidiar en el trabajo. Funciona como se muestra en 2012. Me he convencido de comenzar a usar punto y coma debido a la depreciación. No espero que sea un problema en 2008 la mayor parte del tiempo.
Pilot_51
1
¡Tu respuesta es la mejor con diferencia! Se merece muchos más votos a favor.
Stewart
22

Si leo esto correctamente, será un requisito usar puntos y comas para finalizar las instrucciones TSQL. http://msdn.microsoft.com/en-us/library/ms143729%28v=sql.120%29.aspx

EDITAR: Encontré un complemento para SSMS 2008R2 que formateará su script y agregará los puntos y comas. Aunque creo que todavía está en beta ...

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

EDITAR: encontré una herramienta / complemento gratuito aún mejor llamado ApexSQL ... http://www.apexsql.com/

Spidermain50
fuente
11

Opinión personal: Úselos solo donde se requieran. (Consulte la respuesta de TheTXI arriba para ver la lista requerida).

Como el compilador no los requiere, puedes ponerlos todos, pero ¿por qué? El compilador no le dirá dónde olvidó uno, por lo que terminará con un uso inconsistente.

[Esta opinión es específica de SQL Server. Otras bases de datos pueden tener requisitos más estrictos. Si está escribiendo SQL para ejecutarse en múltiples bases de datos, sus requisitos pueden variar.]

tpdi declaró anteriormente, "en un script, ya que está enviando más de una declaración, la necesita". Eso en realidad no es correcto. No los necesitas.

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

Salida:

Semicolons are optional
Semicolons are optional
Semicolons are optional
Semicolons are optional
Rob Garrison
fuente
1
¿Qué opinas de esta discusión? sqlservercentral.com/Forums/Topic636549-8-1.aspx (puede usar [email protected]: bugmenot si no tiene una cuenta)
Anwar Pinto
2
Le agradezco que haya declarado claramente que esta es solo su opinión, sin embargo, no creo que sea una buena respuesta porque entra en conflicto con la documentación de Microsoft y el estándar ANSI. Creo que esta opinión sería mejor en un comentario. (¡No estoy tratando de atacarte, tienes derecho a tus opiniones sobre el uso del punto y coma!)
izzy
4

Todavía tengo mucho que aprender sobre T-SQL, pero al elaborar un código para una transacción (y basar el código en ejemplos de stackoverflow y otros sitios) encontré un caso en el que parece que se requiere un punto y coma y si falta, la declaración no parece ejecutarse en absoluto y no se genera ningún error. Esto no parece estar cubierto en ninguna de las respuestas anteriores. (Esto estaba usando MS SQL Server 2012.)

Una vez que hice que la transacción funcionara de la manera que quería, decidí ponerle un try-catch para que, si hay algún error, se revierta. Solo después de hacer esto, la transacción no se confirmó (SSMS lo confirma al intentar cerrar la ventana con un mensaje agradable que le alerta sobre el hecho de que hay una transacción no confirmada.

Así que esto

COMMIT TRANSACTION 

fuera de un bloque BEGIN TRY / END TRY funcionó bien para confirmar la transacción, pero dentro del bloque tenía que ser

COMMIT TRANSACTION;

Tenga en cuenta que no se proporciona ningún error o advertencia y no hay indicación de que la transacción aún no se haya confirmado hasta que intente cerrar la pestaña de consulta.

Afortunadamente, esto causa un problema tan grande que es inmediatamente obvio que hay un problema. Desafortunadamente, dado que no se informa ningún error (sintaxis o de otro tipo), no era inmediatamente obvio cuál era el problema.

Por el contrario, la TRANSACCIÓN ROLLBACK parece funcionar igualmente bien en el bloque BEGIN CATCH con o sin punto y coma.

Puede haber algo de lógica en esto, pero se siente arbitrario y Alicia en el país de las maravillas.

Matthew Davidian
fuente
Una posible causa de esto es que COMMIT TRANSACTIONacepta una transacción opcional / nombre de punto de guardado (que ignorará). Sin un punto y coma final, COMMIT TRANSACTIONpuede comer el siguiente símbolo si se analiza como un identificador, que puede cambiar radicalmente la semántica del código. Si esto resulta en un error, CATCHpuede activarse sin COMMIThaber sido ejecutado. Por el contrario, aunque ROLLBACK TRANSACTIONtambién acepta un identificador opcional como este, es muy probable que un error al analizar allí resulte en que la transacción se revierta de todos modos.
Jeroen Mostert
3

Parece que punto y coma no deben ser utilizados en conjunción con operaciones de cursor: OPEN, FETCH, CLOSEyDEALLOCATE . Acabo de perder un par de horas con esto. ¡Observé de cerca el BOL y noté que [;] no se muestra en la sintaxis de estas instrucciones de cursor!

Entonces tuve:

OPEN mycursor;

y esto me dio el error 16916.

Pero:

OPEN mycursor

trabajó.

rab
fuente
2
No creo que esto sea correcto. El BOL no es muy consistente al mencionar el punto y coma en la sintaxis de la declaración, eche un vistazo a SELECT, por ejemplo. Además, he sido testigo de OPEN someCursor; funciona bien, lo mismo para FETCH, CLOSE y DEALLOCATE ...
Valentino Vranken
Eso me sugiere un error con el analizador. ¿Qué versión de SQL Server está / estaba usando?
Stewart
0

Cuando se utiliza una instrucción DISABLE o ENABLE TRIGGER en un lote que contiene otras instrucciones, la instrucción justo antes de que finalice con un punto y coma. De lo contrario, obtendrá un error de sintaxis. Me arranqué el pelo con este ... Y luego, me topé con este artículo de MS Connect sobre lo mismo. Está cerrado ya que no se arreglará.

mira aquí

Nick V
fuente
0

Nota: Esto responde la pregunta tal como está escrita, pero no el problema como se indicó. Agregándolo aquí, ya que la gente lo buscará

El punto y coma también se usa antes WITHen las declaraciones recursivas de CTE:

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

Esta consulta generará un CTE llamado Números que consta de enteros [1..10]. Se realiza creando una tabla con el valor 1 solamente, y luego recurriendo hasta llegar a 10.

v010dya
fuente
8
Técnicamente no 'antes con', sino después de lo que sea que venga antes con. Si with es la primera instrucción del lote, no se requiere punto y coma.
Tor Haugen
No es también utilizado antes CON. Este es solo el punto y coma que termina la declaración anterior. Parece que algunas personas han decidido que el punto y coma debe estar aquí, ya que este es un escenario en el que se requiere dicho punto y coma. No sé por qué estas personas han decidido que esto es superior a terminar siempre las declaraciones con punto y coma.
Stewart
0

Si te gusta obtener un tiempo de espera de comando aleatorio errores en SQLServer, deje el punto y coma al final de las cadenas de CommandText.

No sé si esto está documentado en alguna parte o si es un error, pero sucede y lo he aprendido por amarga experiencia.

Tengo ejemplos verificables y reproducibles usando SQLServer 2008.

aka -> En la práctica, siempre incluya el terminador incluso si solo está enviando una declaración a la base de datos.

Allan Maher
fuente
Si obtiene tiempos de espera para una consulta basada en nada más que si hay o no un punto y coma al final, entonces eso es casi seguro causado por tener diferentes planes de ejecución, ya que estos se almacenan en caché al coincidir en el texto exacto de la consulta, lo que incluye semánticamente irrelevante cosas como espacios en blanco, comentarios y un punto y coma que termina. Sin embargo, el punto y coma será completamente inocente de causar problemas de tiempo.
Jeroen Mostert
-2

Los punto y coma no siempre funcionan en sentencias SELECT compuestas.

Compare estas dos versiones diferentes de una declaración SELECT compuesta trivial.

El código

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

devoluciones

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

Sin embargo, el código

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

devoluciones

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

(1 row(s) affected)
John Feild
fuente
11
[Un año después]: ¡Vaya, me sorprende que nadie haya comentado esta respuesta todavía! Por supuesto, no funcionará, los puntos y comas son separadores de sentencias, por lo que su código con los puntos y comas es: 1- SELECT @ Test = (SELECT (SELECT (SELECT 'Los puntos y comas no siempre funcionan bien'; - esto no es correcto enunciado 2-); - tampoco es esto 3-); - tampoco ese 4-); - ni ese el punto y coma debe estar después del paréntesis 3
PhpLou
1
Solo usa punto y coma para terminar las declaraciones . Una subconsulta no es una declaración. Las declaraciones son cosas que se ejecutan en secuencia. En su ejemplo, hay tres afirmaciones: 1. DECLARE @ Test varchar (35) 2. SELECT @ Test = (SELECT (SELECT (SELECT 'Los puntos y comas no siempre funcionan bien'))) 3. SELECT @ Test Test
Stewart