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?
sql-server
tsql
Anwar Pinto
fuente
fuente
Respuestas:
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.
fuente
THROW
una 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
MERGE
también por ejemplo). Como se menciona en otras respuestas, en el estándar ANSI son obligatoriosPor 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.
fuente
En SQL2008 BOL dicen que en las próximas versiones se requerirán puntos y comas. Por lo tanto, úsalo siempre.
Referencia:
fuente
Usted debe usarlo.
Y lo más importante:
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 ):fuente
not using them
té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 :-)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.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/
fuente
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.
Salida:
fuente
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
fuera de un bloque BEGIN TRY / END TRY funcionó bien para confirmar la transacción, pero dentro del bloque tenía que ser
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.
fuente
COMMIT TRANSACTION
acepta una transacción opcional / nombre de punto de guardado (que ignorará). Sin un punto y coma final,COMMIT TRANSACTION
puede 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,CATCH
puede activarse sinCOMMIT
haber sido ejecutado. Por el contrario, aunqueROLLBACK TRANSACTION
tambié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.Parece que punto y coma no deben ser utilizados en conjunción con operaciones de cursor:
OPEN
,FETCH
,CLOSE
yDEALLOCATE
. 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:
y esto me dio el error 16916.
Pero:
trabajó.
fuente
Según las convenciones de sintaxis de Transact-SQL (Transact-SQL) (MSDN)
(también vea el comentario de @gerryLowry)
fuente
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í
fuente
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
WITH
en las declaraciones recursivas de CTE: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.
fuente
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.
fuente
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
devoluciones
Sin embargo, el código
devoluciones
fuente