En SQL Server, ¿cuándo debe usar GO y cuándo debe usar punto y coma?


100

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

Cuando ejecuto el script Generate en SQL Server Management Studio, parece usar GO en todas partes, pero no el punto y coma.


Respuestas:


93

GOsolo se relaciona con SSMS: no es Transact SQL real, solo le dice a SSMS que envíe las declaraciones SQL entre cada una GOen lotes individuales de forma secuencial.

El ;es un delimitador de sentencias SQL, pero en su mayor parte el motor puede interpretar en sus estados de cuenta se rompen.

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


5
Énfasis en la parte GOnot T-SQL mientras ;está
msarchet

2
Una MERGEdeclaración debe terminar con un punto y coma.
cuando

15
Actualización: en SQL Server 2012 NO usar punto y coma está obsoleto, 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: technet.microsoft.com/en-us/library/ms143729.aspx o el libro sobre SQL Server 2012: shop.oreilly.com/product/0790145321978.do
Paweł Bulwan

1
SQL 2014 todavía muestra el punto y coma como se requiere para la próxima versión. Me pregunto cuándo quedará obsoleto. technet.microsoft.com/en-us/library/ms143729.aspx
Frank

2
+ buli no indica que ;esté desaprobado, NO usarlo está desaprobado, es decir, se convertirá en obligatorio según la fuente.
cjk

78

La razón por la que ve tantos GO en los scripts DDL generados se debe a la siguiente regla sobre lotes.

Las declaraciones CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE REGLA, CREATE TRIGGER y CREATE VIEW no se pueden combinar con otras instrucciones en un lote. La instrucción CREATE debe comenzar el lote. Todas las demás 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 de DDL generado es generar varios objetos en un solo archivo. Debido a esto, un generador de DDL debe poder generar lotes. Como han dicho otros, la declaración GO pone fin al lote.


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

Me parece que GO termina las declaraciones que crean objetos que contienen SQL que pueden contener; terminador de declaraciones. En otro DBMS he visto la capacidad de establecer la cadena de terminación. Por ejemplo, puede especificar que las declaraciones terminen con dos caracteres de barra vertical ||. A continuación, podría emitir CREATE PROCEDURE ... mucho SQL que termine en; ... || y el conducto doble finaliza la instrucción CREATE PROCEDURE. Entonces, mi pregunta es si esto es análogo a la declaración de MS GO. En segundo lugar, ¿puede redefinir la cadena de terminación en SQLSERVER?
puedes llegar a mí

@youcantryreachingme No sé si esto fue cierto en 2010, pero parece que puedes. Consulte SSMS: Separador de lotes . No estoy seguro de cuáles son los límites de esto
Conrad Frix

34

VAMOS

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 cruza GOdeclaraciones.

Las tablas #Temp son locales para una conexión, por lo que se extienden a través de declaraciones GO.

Punto y coma

Un punto y coma es un terminador de declaraciones. Esto se usa únicamente para identificar que una declaración en particular ha finalizado.

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

Sin embargo, los CTE exigen que WITH sea la primera instrucción, por lo que necesita un punto y coma antes de WITH.


4
Una MERGEdeclaración debe terminar con un punto y coma.
cuando

11

Debe usar un punto y coma para terminar cada declaración SQL. Esto se define en los Estándares SQL,

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

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

;WITH ...

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

Además, una MERGEdeclaración debe terminar con un punto y coma. ¿Ves un patrón aquí? Estas son algunas de las adiciones más recientes 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 realmente extraño " - No podría estar más de acuerdo. Y la constante repetición de esto conduce a preguntas extrañas como esta o esta
un_horse_con_no_nombre

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

@ProfK: gracias por incluir la puntuación en su comentario, lo que me facilita la lectura y la comprensión, especialmente los caracteres que terminan la oración. Aunque su uso de guiones no cumple con el inglés estándar ...
cuando el

8

GO es un terminador de lotes, un punto y coma es un terminador de instrucciones.

utilizará GO cuando desee tener varias sentencias create proc en 1 script porque create proc debe ser la primera sentencia de un lote. Si usa expresiones de tabla comunes, la declaración anterior debe terminarse con un punto y coma


UNA MERGEdeclaración debe terminar con un punto y coma.
cuando
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.