Entorno de ejecución de lotes y MARS

A partir de Microsoft SQL Server 2005, las conexiones se pueden habilitar para admitir conjuntos de resultados activos múltiples (MARS). Estas conexiones tienen asociado un entorno de ejecución de lotes predeterminado.

El entorno de ejecución de lotes consta de los siguientes componentes:

  • Valores de opción SET (incluidos ANSI_NULLS, DATE_FORMAT, LANGUAGE y TEXTSIZE)

  • Contexto de seguridad (la función de usuario o aplicación para el entorno de ejecución de lotes)

  • Contexto de base de datos (la base de datos actual para el entorno)

  • Funciones de estado de ejecución (incluidas @@ERROR, @@ROWCOUNT, @@FETCH_STATUS y @@IDENTITY)

  • Tablas temporales de nivel superior

Cada nuevo lote que empieza a ejecutarse para una conexión específica recibe una copia del entorno predeterminado. Siempre que se ejecuta un lote, todos los cambios efectuados en el entorno de ejecución tienen como ámbito ese lote en concreto. Cuando finaliza la ejecución, su configuración se copia en el entorno predeterminado. En el caso de un solo lote que emite varios comandos de ejecución secuencial, el comportamiento observado es el mismo que el de las conexiones en las que intervienen clientes o servidores de versiones anteriores de SQL Server.

En las versiones anteriores de SQL Server, sólo se podía ejecutar un lote a la vez. Por lo tanto, los cambios que un lote realizaba en el entorno de lotes estaban visibles para todos los lotes posteriores.

Para los procedimientos almacenados y funciones, el entorno predeterminado de un lote es el valor predeterminado para la conexión, pero cuando la ejecución finaliza, los cambios no se vuelven a copiar en el entorno de ejecución de lotes predeterminado de la conexión.

Por ejemplo, supongamos que dos lotes se ejecutan de la siguiente manera:

--First Batch
SET ARITHABORT ON
SET ANSI_WARNINGS ON
SELECT 1/0
GO
--Second Batch
SET ARITHABORT OFF
SET ANSI_WARNINGS OFF
SELECT 1/0
GO

Supongamos también que MARS está habilitado para la conexión con un entorno de ejecución predeterminado, con SET ARITHABORT establecido en OFF y SET ANSI_WARNINGS establecido en ON.

Si los dos lotes se envían al mismo tiempo en la conexión, empezarán a ejecutarse con la configuración del entorno de lotes predeterminado de la conexión. Durante la ejecución, sus entornos se acotan para garantizar que los cambios de entorno en un lote no afecten a los cambios del otro lote. Cuando un lote finaliza su ejecución, vuelve a copiar el entorno resultante al valor predeterminado de la conexión. El entorno predeterminado resultante para la conexión depende del último lote que finaliza la ejecución. Éste será el entorno que utilizará el siguiente lote que se ejecute.