2010-09-13 24 views
78

Siempre me han confundido cuándo debería usar la palabra clave GO después de los comandos y si se necesita un punto y coma al final de los comandos. ¿Cuáles son las diferencias y por qué/cuándo debo usarlas?En SQL Server, ¿cuándo debería usar GO y cuándo debería usar punto y coma?

Cuando ejecuto la secuencia de comandos Generate en SQL Server Management Studio, parece utilizar GO por todas partes, pero no el punto y coma.

+2

posible duplicado de [¿Cuál es la diferencia entre ";" y "IR" en TSQL (SQL 2008)?] (http://stackoverflow.com/questions/1517527/what-is-the-difference-between-and-go-in-tsql-sql-2008) – JohnFx

Respuesta

79

GO solo se refiere a SSMS: no es Transact SQL real, solo le dice a SSMS que envíe las sentencias SQL entre cada GO en lotes individuales secuencialmente.

El ; es un delimitador de instrucciones SQL, pero en su mayor parte el motor puede interpretar dónde se dividen sus declaraciones.

La excepción principal, y el lugar donde se usa con más frecuencia ; es antes de una declaración de expresión de tabla común.

+3

Énfasis en el 'GO 'no es parte de T-SQL mientras'; 'es – msarchet

+2

Una sentencia' MERGE' debe terminar con un punto y coma. – onedaywhen

+13

Actualización: en SQL Server 2012 NO está en uso el punto y coma, lo que significa que serán necesarios en la próxima versión. Por lo tanto, es una buena práctica usar punto y coma, ya que requerirá menos trabajo en caso de migración (y porque es un estándar). Fuente: http://technet.microsoft.com/en-us/library/ms143729.aspx o el libro sobre SQL Server 2012: http://shop.oreilly.com/product/0790145321978.do –

6

GO es un terminador de lote, un punto y coma es un terminador de enunciado.

utilizará GO cuando desee tener múltiples instrucciones de creación de proc en 1 secuencia de comandos porque create proc tiene que ser la primera instrucción en un lote. Si usa expresiones de tabla comunes, entonces la instrucción antes de que deba terminarse con un punto y coma

+0

Una instrucción 'MERGE' debe terminar con un punto y coma. – onedaywhen

9

Debe usar un punto y coma para terminar cada instrucción de SQL. Esto se define en las normas SQL,

Claro, la mayoría de las veces SQL Server le permite omitir el terminador de la declaración, pero ¿por qué entrar en malos hábitos?

Como han señalado otros, la declaración que precede a una expresión de tabla común (CTE) debe terminarse con un punto y coma. Como consecuencia de ello, desde el folk que no han adoptado plenamente el terminador punto y coma, vemos esto:

;WITH ... 

que creo que se ve muy extraño. Supongo que tiene sentido en un foro en línea cuando no se puede decir la calidad del código en el que se pegará.

Además, una declaración MERGE debe terminar con un punto y coma. ¿Ves un patrón aquí? Estas son algunas de las adiciones más nuevas a TSQL que siguen de cerca los Estándares SQL. Parece que el equipo de SQL Server va por el camino de exigir el uso del terminador de punto y coma.

+2

"* que creo que se ve muy extraño *" - No podría estar más de acuerdo. Y la repetición constante de esto lleva a preguntas extrañas como [esto] (http://stackoverflow.com/questions/26670414/how-use-with-in-subquery-ms-sql) o [this] (http: // stackoverflow.com/questions/26233895/cte-execute-commands-before-using-the- send-table) –

+0

SQL Server no permite que sea descuidado: le permite omitir un terminador de instrucción redundante; T-SQL, como la mayoría de los demás SQL, no es un estándar puro de SQL, que se parece más a una clase base abstracta, que no se usa en la práctica a favor del propio dialecto del motor de DB. – ProfK

+0

@ProfK: gracias por incluir la puntuación en su comentario, lo que me facilita la lectura y el entendimiento, en particular los caracteres del terminador de la oración. Aunque su uso de guiones no cumple con el inglés estándar ... – onedaywhen

32

GO

Go es un separador de lotes. Esto significa que todo en ese lote es local para ese lote en particular.

Cualquier declaración de Variables, Variables de tabla, etc. no van a través de declaraciones GO.

Las tablas #Temp son locales para una conexión, por lo que abarcan todas las declaraciones GO.

punto y coma

un punto y coma es un terminador de la sentencia. Esto es puramente utilizado para identificar que una declaración particular ha terminado.

En la mayoría de los casos, la sintaxis de la declaración en sí misma es suficiente para determinar el final de una declaración.

CTE, sin embargo, exige que el WITH sea la primera instrucción, por lo que necesita un punto y coma antes del WITH.

+3

Una sentencia 'MERGE' debe terminar con un punto y coma. – onedaywhen

67

La razón por la que ve tantos GO en scripts Generados DDL es por el siguiente rule sobre lotes.

CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER, y CREATE VIEW no se pueden combinar con otros declaraciones en un lote. La instrucción CREATE debe comenzar el lote. Todas las otras declaraciones que siguen en ese lote se interpretarán como parte de la definición de la primera instrucción CREATE .

Uno de los casos de uso para Generated DDL es generar múltiples objetos en un solo archivo. Debido a esto, un generador DDL debe ser capaz de generar lotes. Como otros han dicho, la declaración GO finaliza el lote.

+8

Este es el único que realmente respondió "... ¿cuándo deberías usar GO ...?" parte de la pregunta. – Roimer

Cuestiones relacionadas