SET (Transact-SQL)
El lenguaje de programación Transact-SQL ofrece varias instrucciones SET que cambian el tratamiento de información específica por parte de la sesión actual. Las instrucciones SET se agrupan en las categorías que figuran en la siguiente tabla.
Para obtener información sobre cómo establecer variables locales con la instrucción SET, vea SET @local\_variable (Transact-SQL).
Categoría |
Instrucciones |
---|---|
Instrucciones de fecha y hora |
|
Instrucciones de bloqueo |
|
Otras instrucciones |
|
Instrucciones de ejecución de consultas |
|
Instrucciones de configuración de ISO |
|
Instrucciones de estadísticas |
|
Instrucciones de transacciones |
Consideraciones al utilizar las instrucciones SET
Todas las instrucciones SET se implementan en tiempo de ejecución, salvo SET FIPS_FLAGGER, SET OFFSETS, SET PARSEONLY y SET QUOTED_IDENTIFIER. Estas instrucciones se implementan en tiempo de análisis.
Si se ejecuta una instrucción SET en un procedimiento almacenado o desencadenador, el valor de la opción SET se restaura cuando el control vuelve del procedimiento almacenado o desencadenador. Además, si se especifica una instrucción SET en una cadena de SQL dinámico que se ejecuta mediante sp_executesql o EXECUTE, el valor de la opción SET se restaura cuando el control vuelve del lote especificado en la cadena de SQL dinámico.
Los procedimientos almacenados se ejecutan con las opciones de SET especificadas en tiempo de ejecución, excepto en el caso de SET ANSI_NULLS y SET QUOTED_IDENTIFIER. Los procedimientos almacenados que utilizan SET ANSI_NULLS o SET QUOTED_IDENTIFIER usan las opciones especificadas en el momento de crear el procedimiento almacenado. Si se usan dentro de un procedimiento almacenado, las opciones SET no tienen ningún efecto.
La opción user options de sp_configure permite aplicar opciones a todo el servidor y sirve para múltiples bases de datos. Además, esta opción se comporta como una instrucción SET explícita, pero con la diferencia de que tiene lugar en el momento de iniciar la sesión.
Las opciones de base de datos establecidas con ALTER DATABASE sólo son válidas en el nivel de base de datos y sólo tienen efecto cuando se establecen explícitamente. Las opciones de base de datos anulan las opciones de instancia que se establecen mediante sp_configure.
En cualquiera de las instrucciones SET con opciones ON y OFF, puede especificar ON u OFF para múltiples opciones de SET.
[!NOTA]
Esto no se aplica a las opciones SET relacionadas con estadísticas.
Por ejemplo, SET QUOTED_IDENTIFIER, ANSI_NULLS ON establece QUOTED_IDENTIFIER y ANSI_NULLS en ON.
Las opciones de las instrucciones SET anulan las opciones de base de datos equivalentes que se establecen mediante ALTER DATABASE. Por ejemplo, el valor especificado en una instrucción SET ANSI_NULLS anulará la opción de la base de datos de ANSI_NULLS. Además, en algunas opciones de conexión se establece ON automáticamente cuando un usuario se conecta a una base de datos con los valores efectivos de la vez anterior que se utilizó la opción de sp_configure user options o los valores que se aplican a todas las conexiones ODBC y OLE/DB.
Las instrucciones ALTER, CREATE y DROP DATABASE no respetan la opción SET LOCK_TIMEOUT.
Cuando una instrucción SET global o abreviada, como SET ANSI_DEFAULTS, establece varias opciones, al ejecutar la instrucción SET abreviada se restablecen los valores anteriores de todas las opciones a las que afecta. Si una opción individual de SET afectada por una instrucción SET abreviada se establece explícitamente después de ejecutar la instrucción SET abreviada, la instrucción SET individual tiene precedencia sobre las opciones correspondientes de la instrucción abreviada.
Al utilizar lotes, el lote establecido mediante la instrucción USE determina el contexto de la base de datos. Las consultas "ad hoc" y todas las demás instrucciones que se ejecuten fuera del procedimiento almacenado y que se encuentren en lotes heredan las opciones de base de datos y conexión establecidas mediante la instrucción USE.
Las solicitudes MARS (conjuntos de resultados activos múltiples) comparten un estado global que contiene los valores de SET de la sesión más reciente. Al ejecutar una solicitud, se pueden modificar las opciones de SET. Los cambios son específicos al contexto de solicitud en el que se encuentran, y no afectan a otras solicitudes MARS simultáneas. No obstante, una vez ejecutada la solicitud, las nuevas opciones de SET se copian en el estado de sesión global. Las nuevas solicitudes que se ejecuten en la misma sesión después de este cambio utilizarán estas nuevas opciones de SET.
Cuando se ejecuta un procedimiento almacenado desde un lote o desde otro procedimiento almacenado, la ejecución se realiza con las opciones establecidas en ese momento en la base de datos que contiene el procedimiento almacenado. Por ejemplo, cuando el procedimiento almacenado db1.dbo.sp1 llama al procedimiento almacenado db2.dbo.sp2, el procedimiento almacenado sp1 se ejecuta con la opción de nivel de compatibilidad actual de la base de datos db1, y el procedimiento almacenado sp2 se ejecuta con la opción de nivel de compatibilidad actual de la base de datos db2.
Cuando una instrucción Transact-SQL hace referencia a objetos que residen en varias bases de datos, el contexto de la base de datos actual y el contexto de la conexión actual se aplican a la instrucción. En este caso, si la instrucción Transact-SQL está en un lote, el contexto de conexión actual es la base de datos definida mediante la instrucción USE; si la instrucción Transact-SQL está en un procedimiento almacenado, el contexto de conexión es la base de datos que contiene el procedimiento almacenado.
Cuando se crean o manipulan índices en columnas calculadas o vistas indizadas, las opciones SET ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER, ANSI_NULLS, ANSI_PADDING y ANSI_WARNINGS deben establecerse en ON. La opción NUMERIC_ROUNDABORT debe ser OFF.
Si alguna de estas opciones no tiene los valores exigidos, se producirá un error en las acciones INSERT, UPDATE, DELETE, DBCC CHECKDB y DBCC CHECKTABLE en las tablas o vistas indizadas con índices en las columnas calculadas. SQL Server generará un error indicando las opciones que no se han establecido correctamente. Además, SQL Server procesará las instrucciones SELECT en estas tablas o vistas indizadas como si no existieran los índices en las columnas calculadas ni en las vistas.