¿Cuál es la diferencia entre ";" y "GO" en T-SQL?


Uso ADO.NET así como la utilidad sqlcmd para enviar scripts SQL a SQL Server 2008. ¿Cuál es la diferencia entre usar ; y GO para separar trozos de SQL?

Author: DavidRR, 2009-10-05

7 answers

GO no es realmente un comando T-SQL. El comando GO fue introducido por Microsoft tools como una forma de separar instrucciones por lotes, como el final de un procedimiento almacenado. GO es compatible con las herramientas de pila de Microsoft SQL, pero no forma parte de otras herramientas.

No se puede poner un GO en una cadena de SQL y enviarlo como parte de un ADO.NET objeto de comando como SQL en sí no entiende el término. Otra forma de demostrar esto es con el generador de perfiles: configure algunas declaraciones que utilice GO en Query Analyzer/Management Studio y, a continuación, ejecute el generador de perfiles cuando lo ejecute. Verá que se emiten como comandos separados para el servidor.

El punto y coma se usa para significar el final de una declaración en sí, no necesariamente un lote completo.

Http://msdn.microsoft.com/en-us/library/ms188037.aspx

 54
Author: keithwarren7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-28 14:20:55

"GO" es similar a ; en muchos casos, pero de hecho significa el final de un lote.

Cada lote se confirma cuando se llama la instrucción "GO", por lo que si tiene:

SELECT * FROM table-that-does-not-exist;
SELECT * FROM good-table;

En su lote, entonces la selección de tabla buena nunca será llamada porque la primera selección causará un error.

Si en cambio tuvieras:

SELECT * FROM table-that-does-not-exist
GO
SELECT * FROM good-table
GO

La primera instrucción select todavía causa un error, pero como la segunda instrucción está en su propio lote, todavía se ejecutará.

GO has nada que ver con cometer una transacción.

 30
Author: Phillip Knauss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-04 22:21:46

Punto y coma es un separador de sentencias. La(s) sentencia (s) anterior (es) no se ejecuta necesariamente cuando se encuentra un punto y coma.

GO

Significa el final de un lote. Ejecuta el lote anterior de instrucciones, al igual que encontrar el final del bloque.

GO 2

Significa ejecutar el lote tantas veces. Creo que he usado esa opción tal vez dos veces en mi vida. Por otra parte, no soy un DBA por el comercio.

 21
Author: Bob Kaufman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-04 22:22:34
  1. Bajo SQL Server TSQL (2005 - 2016) tenga en cuenta que:

    • Punto y coma (;) es un bloque terminador.
    • GO es un batch terminator.
  2. Además, GO se puede usar para invocar el mismo bloque DML varias veces usando la siguiente sintaxis:

GO [count]

Donde [count] es un entero positivo que indica cuántas veces el bloque TSQL de comandos que preceden a dicho GO deben llevarse a cabo sobre y sobre.

  1. También, a diferencia del punto y coma, GO es obligatorio antes de un nuevo DDL, digamos, cuando se crea una nueva vista, ya que un punto y coma que separa los comandos anteriores desencadenará un error. Por ejemplo:

Drop view # temporary_view
GO
crear vista #another_view...
NO > SIN ERRORES

Si reemplazó GO con un punto y coma en el ejemplo anterior, generará el siguiente mensaje de error:

'CREATE VIEW' debe ser la primera instrucción de un consulta por lotes.

 6
Author: user3285866,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-25 20:16:42

'GO' se usa típicamente para indicar el final de un lote de sentencias SQL, lo que significa que podría tener un begin transaction y end transaction envuelto en una sola colección de sentencias que podrían fallar o tener éxito juntas.

';' se usa generalmente para separar varias sentencias SQL entre sí. Esto es notable en los scripts SQL que necesitan devolver varios conjuntos de registros, como `select * from table1; select * from table2;', lo que daría lugar a dos conjuntos de registros separados en el del lado del cliente.

 4
Author: Mike J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-04 22:17:48

El comando GO significa el final de un lote. Por lo tanto, todas las variables declaradas antes de GO son inválidas después del comando GO. Contra el punto y coma no termina el lote.

Si va a usar un comando DML en un procedimiento, use el punto y coma en su lugar GO. Por ejemplo:

CREATE PROCEDURE SpMyProc
@myProcParam VARCHAR(20)
AS
DECLARE @myOtherParam INT = 5
;DISABLE TRIGGER ALL ON tMyTable
UPDATE tMyTable SET myVar = @myProcParam, mySecondVar = @myOtherParam
;ENABLE TRIGGER OLL ON tMyTable 
 1
Author: valerius.kaiser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-12 10:20:15

Pensé que el carácter ; separa una lista de comandos SQL, GO simplemente indica a SQL Server que confirme todos los comandos anteriores.

 0
Author: Phil.Wheeler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-04 22:17:24