Lotes

Un lote es un grupo de una o varias instrucciones de Transact-SQL enviadas a la vez desde una aplicación a SQL Server para que se ejecuten. SQL Server compila las instrucciones de un lote en una sola unidad ejecutable denominada plan de ejecución. Las instrucciones del plan de ejecución se ejecutan de una en una.

Cada instrucción de Transact-SQL debe finalizar con un punto y coma. Este requisito no es necesario, pero la capacidad de finalizar una instrucción sin punto y coma es obsoleta y podría eliminarse en versiones futuras de Microsoft SQL Server.

Un error de compilación, como un error de sintaxis, impide la compilación del plan de ejecución. Por lo tanto, no se ejecuta ninguna de las instrucciones del lote.

Un error en tiempo de ejecución, como un desbordamiento aritmético o una infracción de restricción, tiene uno de los siguientes efectos:

  • La mayoría de los errores en tiempo de ejecución detienen la instrucción actual y las instrucciones que siguen en el lote.

  • Algunos errores en tiempo de ejecución, como las infracciones de restricciones, sólo detienen la instrucción actual. Las restantes instrucciones del lote se ejecutan.

Las instrucciones ejecutadas antes de la instrucción en la que se encontró el error en tiempo de ejecución no se ven afectadas. La única excepción se produce cuando el lote se encuentra en una transacción y el error hace que ésta se revierta. En este caso, se revertirán todas las modificaciones de datos sin confirmar realizadas antes de que se produzca el error en tiempo de ejecución.

Por ejemplo, suponga que hay diez instrucciones en un lote. Si la quinta instrucción tiene un error de sintaxis, no se ejecutará ninguna de las instrucciones del lote. Si se compila el lote y la segunda instrucción produce un error mientras se está ejecutando, los resultados de la primera instrucción no se verán afectados porque ya se ha ejecutado.

SQL Server ofrece recompilación a nivel de instrucciones. Es decir, si una instrucción desencadena una nueva compilación, sólo se vuelve a compilar esa instrucción y no el lote completo. Este comportamiento difiere de SQL Server 2000. Considere el ejemplo siguiente que contiene una instrucción CREATE TABLE y cuatro instrucciones INSERT en el mismo lote.

CREATE TABLE dbo.t3(a int) ;
INSERT INTO dbo.t3 VALUES (1) ;
INSERT INTO dbo.t3 VALUES (1,1) ;
INSERT INTO dbo.t3 VALUES (3) ;
GO

SELECT * FROM dbo.t3 ;

En primer lugar se compila el lote. Se compila la instrucción CREATE TABLE pero, como la tabla dbo.t3 no existe todavía, las instrucciones INSERT no se compilan.

En segundo lugar se empieza a ejecutar el lote. Se crea la tabla. La primera instrucción INSERT se compila e inmediatamente se ejecuta. La tabla tiene ahora una fila. A continuación, se compila la segunda instrucción INSERT. La compilación origina un error y el lote finaliza. La instrucción SELECT devuelve una fila.

En SQL Server 2000, el lote se empieza a ejecutar y se crea la tabla. Las tres instrucciones INSERT se compilan una a una pero no se ejecutan. Como la segunda instrucción INSERT produce un error de compilación, el lote completo finaliza. La instrucción SELECT no devuelve ninguna fila.

Reglas para utilizar lotes

La utilización de lotes sigue estas reglas:

  • Las instrucciones CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE SCHEMA, CREATE TRIGGER y CREATE VIEW no pueden combinarse con otras instrucciones de un lote. El lote debe empezar con una instrucción CREATE. Las siguientes instrucciones del lote se interpretarán como parte de la definición de la primera instrucción CREATE.

  • No se puede cambiar una tabla y luego hacer referencia a las columnas nuevas en el mismo lote.

  • Si una instrucción EXECUTE fuera la primera instrucción de un lote, no se necesitaría la palabra clave EXECUTE. La palabra clave EXECUTE es necesaria si la instrucción EXECUTE no es la primera instrucción del lote.

Nota importanteImportante

Los archivos por lotes almacenan las credenciales como texto sin formato. Las credenciales pueden mostrarse en la pantalla del usuario durante la ejecución del lote.