He leído y leído sobre MSDN, etc. Ok, entonces señala el final de un lote.
¿Qué define un lote? No veo por qué necesito ir cuando estoy pegando un montón de scripts para ejecutarlos todos al mismo tiempo.
Nunca he entendido GO. ¿Alguien puede explicar esto mejor y cuándo necesito usarlo (después de cuántas o qué tipo de transacciones)?
Por ejemplo, ¿por qué necesitaría IR después de cada actualización aquí:
UPDATE [Country]
SET [CountryCode] = 'IL'
WHERE code = 'IL'
GO
UPDATE [Country]
SET [CountryCode] = 'PT'
WHERE code = 'PT'
go
también se restablece / borradeclare @foo
las declaraciones de variables: estaba obteniendo que necesita declarar errores @foo , hasta que comenté elgo
.Respuestas:
GO
no es correctamente un comando TSQL.En cambio, es un comando para el programa cliente específico que se conecta a un servidor SQL (Sybase o Microsoft, no estoy seguro de lo que hace Oracle), indicando al programa cliente que el conjunto de comandos que se ingresaron en él hasta el "ir" necesita para ser enviado al servidor para ser ejecutado.
¿Por qué / cuándo lo necesitas?
GO en el servidor MS SQL tiene un parámetro "recuento", por lo que puede usarlo como un acceso directo "repetir N veces".
Las actualizaciones extremadamente grandes pueden llenar el registro del servidor SQL. Para evitar eso, es posible que tengan que separarse en lotes más pequeños a través de
go
.En su ejemplo, si la actualización de un conjunto de códigos de país tiene un volumen tal que se quedará sin espacio de registro, la solución es separar cada código de país en una transacción separada, lo que puede hacerse separándolos en el cliente con
go
.Algunas declaraciones SQL DEBEN estar separadas por GO de las siguientes para que funcionen.
Por ejemplo, no puede soltar una tabla y volver a crear la tabla con el mismo nombre en una sola transacción, al menos en Sybase (lo mismo para crear procedimientos / disparadores):
fuente
GO
no "crea una transacción para usted". Si no está ejecutando una transacción explícita, cada declaración creará su propia transacción de todos modos. Es completamente ortogonal. Si desea dividir una actualización más grande en pasos más pequeños, aún puede hacerlo en un solo lote como en elWHILE @@ROWCOUNT > 0
patrón común .UPDATE T1 SET X =2;UPDATE T1 SET X =2;
se ejecutará como dos transacciones separadas de todos modos . La adición de noGO
hace absolutamente ninguna diferencia. Y de manera similar, si está ejecutando una transacción explícita, abarca lotes y nuevamenteGO
no hace ninguna diferencia.GO
tiene absolutamente nada que ver con las transacciones, y hace que las respuestas sean un segundo punto sobre las transacciones y el tamaño de un archivo de registro incorrecto.GO
no tendrá efecto alguno. Las respuestas primera y tercera son correctas. Además, hay momentos en los que necesita separar las declaraciones en lotes separados, por ejemplo, no puede agregar una columna a una tabla y luego usar esa columna más adelante en el mismo lote. (continuación)CREATE VIEW
, etc.) deben estar en su propio lote.GO
No es una declaración, es un separador de lotes.Los bloques separados por
GO
son enviados por el cliente al servidor para su procesamiento y el cliente espera sus resultados.Por ejemplo, si escribes
, esto se enviará al servidor como una
3
consulta de una sola línea .Si tú escribes
, esto se enviará al servidor como
3
consultas de una línea.GO
en sí no va al servidor (sin juego de palabras). Es una palabra reservada pura del lado del cliente y solo es reconocida porSSMS
yosql
.Si va a utilizar una herramienta de consulta personalizada para enviarla a través de la conexión, el servidor ni siquiera la reconocerá y emitirá un error.
fuente
CREATE SCHEMA
); otros requieren ser las únicas declaraciones en sus lotes (comoSET SHOWPLAN_XML ON
)Muchos comandos deben estar en su propio lote, como
CREATE PROCEDURE
O, si agrega una columna a una tabla, debería estar en su propio lote. Si intenta SELECCIONAR la nueva columna en el mismo lote, falla porque en el momento del análisis / compilación la columna no existe.
GO es utilizado por las herramientas SQL para resolver esto desde un script: no es una palabra clave SQL y el motor no lo reconoce.
Estos son 2 ejemplos concretos del uso diario de lotes.
Editar: en su ejemplo, no necesita IR ...
Edición 2, ejemplo. No puede soltar, crear y autorizar en un lote ... no menos importante, ¿dónde está el final del procedimiento almacenado?
fuente
A veces es necesario ejecutar el mismo comando o conjunto de comandos una y otra vez. Esto puede ser para insertar o actualizar datos de prueba o puede ser poner una carga en su servidor para pruebas de rendimiento. Cualquiera sea la necesidad, la forma más fácil de hacer esto es configurar un ciclo while y ejecutar su código, pero en SQL 2005 hay una manera aún más fácil de hacerlo.
Supongamos que desea crear una tabla de prueba y cargarla con 1000 registros. Puede emitir el siguiente comando y ejecutará el mismo comando 1000 veces:
fuente: http://www.mssqltips.com/tip.asp?tip=1216
Aparte de eso, marca el "final" de un bloque SQL (por ejemplo, en un procedimiento almacenado) ... lo que significa que está en un estado "limpio" de nuevo ... eG: Parámetros utilizados en la declaración antes de restablecer el código ( ya no está definido)
fuente
Como todos ya dijeron, "IR" no es parte de T-SQL. "IR" es un separador de lotes en SSMS , una aplicación cliente utilizada para enviar consultas a la base de datos. Esto significa que las variables declaradas y las variables de tabla no persistirán del código antes del "IR" al código que lo sigue.
De hecho, GO es simplemente la palabra predeterminada utilizada por SSMS. Esto se puede cambiar en las opciones si lo desea. Para divertirse un poco, cambie la opción en el sistema de otra persona para usar "SELECCIONAR" como separador de lotes en lugar de "IR". Perdona mi cruel risa.
fuente
Se utiliza para dividir bloques lógicos. Su código se interpreta en la línea de comando sql y esto indica el siguiente bloque de código.
Pero podría usarse como una declaración recursiva con un número específico.
Tratar:
Alguna declaración tiene que estar delimitada por GO:
fuente