SET @local_variable (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Punto de conexión de análisis SQL en Microsoft Fabric Warehouse en Microsoft Fabric Base de datos SQL de Microsoft Fabric
Establece la variable local especificada, creada anteriormente mediante la DECLARE @local_variable
instrucción , en el valor especificado.
Convenciones de sintaxis de Transact-SQL
Sintaxis
Sintaxis para SQL Server, Azure SQL Database y Azure SQL Managed Instance:
SET
{ @local_variable
[ . { property_name | field_name } ] = { expression | udt_name { . | :: } method_name }
}
| { @SQLCLR_local_variable.mutator_method }
| { @local_variable
{ += | -= | *= | /= | %= | &= | ^= | |= } expression
}
| { @cursor_variable =
{ @cursor_variable | cursor_name
| { CURSOR [ [ LOCAL | GLOBAL ] ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ , ...n ] ] } ]
}
}
}
Sintaxis para Azure Synapse Analytics, Almacenamiento de datos en paralelo y Microsoft Fabric:
SET @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression
Argumentos
@local_variable
El nombre de una variable de cualquier tipo, excepto cursor, text, ntext, image o table. Los nombres de variables deben comenzar por un signo de arroba ( @
). Los nombres de las variables deben seguir las reglas de los identificadores.
property_name
El nombre de una propiedad definida por el usuario.
field_name
Un campo público de un tipo definido por el usuario.
udt_name
El nombre de un tipo definido por el usuario CLR (Common Language Runtime).
{ . | :: }
Especifica el método de un tipo definido por el usuario CLR. Para un método de instancia (no estático), use un punto (.
). Para un método estático, use dos puntos (::
). Para invocar un método, propiedad o campo de un tipo definido por el usuario CLR, debe tener el permiso EXECUTE para el tipo.
method_name ( argumento [ ,... n ] )
Un método de un tipo definido por el usuario que toma uno o más argumentos para modificar el estado de la instancia de un tipo. Los métodos estáticos deben ser públicos.
@SQLCLR_local_variable
Una variable cuyo tipo se encuentra en un ensamblado. Para más información, consulte Conceptos de programación de integración de Common Language Runtime (CLR).
mutator_method
Un método del ensamblado que puede cambiar el estado del objeto. SQLMethodAttribute.IsMutator se aplica a este método.
{ += | -= | *= | /= | %= | &= | ^= | |= }
Operador de asignación compuesta:
+=
- Agregar y asignar-=
- Restar y asignar*=
- Multiplicar y asignar/=
- Dividir y asignar%=
- Módulo y asignación&=
- Bit aAND
bit y asignar^=
- Bit aXOR
bit y asignar|=
- Bit aOR
bit y asignar
expression
Cualquier expression válida.
cursor_variable
Nombre de una variable de cursor. Si la variable de cursor de destino indicada anteriormente hacía referencia a un cursor diferente, esa referencia se pierde.
cursor_name
Nombre de un cursor declarado mediante la DECLARE CURSOR
instrucción .
CURSOR
Especifica que la SET
instrucción contiene una declaración de un cursor.
SCROLL
Especifica que el cursor admite todas las opciones de captura: FIRST
, LAST
, NEXT
, PRIOR
, RELATIVE
y ABSOLUTE
. No se puede especificar SCROLL
si también se especifica FAST_FORWARD
.
FORWARD_ONLY
Especifica que el cursor solo admite la FETCH NEXT
opción . El cursor solo se recupera en una dirección, desde la primera fila hacia la última. Cuando se especifica FORWARD_ONLY
sin las STATIC
palabras clave , KEYSET
o DYNAMIC
, el cursor se implementa como DYNAMIC
. Si no especifica o FORWARD_ONLY
SCROLL
, FORWARD_ONLY
es el valor predeterminado, a menos que especifique las palabras clave STATIC
, KEYSET
o DYNAMIC
. En el caso STATIC
de los cursores , KEYSET
y DYNAMIC
, SCROLL
es el valor predeterminado.
STATIC
Define un cursor que hace una copia temporal de los datos que utiliza. Todas las solicitudes al cursor se responden desde esta tabla temporal en tempdb
. Como resultado, las modificaciones realizadas en las tablas base una vez abierto el cursor no se reflejan en los datos devueltos por capturas hechas al cursor. Y este cursor no admite modificaciones.
KEYSET
Especifica que la pertenencia y el orden de las filas del cursor se fijan cuando se abre este cursor. El conjunto de claves que identifican de forma única las filas se integra en la tabla keysettable en tempdb
. Los cambios efectuados en valores que no sean claves de las tablas base, ya sean realizados por el propietario del cursor o confirmados por otros usuarios, son visibles cuando el propietario del cursor se desplaza por el cursor. Las inserciones realizadas por otros usuarios no son visibles y no es posible hacer inserciones a través de un cursor de servidor Transact-SQL.
Si se elimina una fila, un intento de capturar la fila devuelve un @@FETCH_STATUS
de -2
. Las actualizaciones de valores de clave desde fuera del cursor son similares a la eliminación de la fila anterior seguida por la inserción de la nueva fila. La fila con los nuevos valores no está visible e intenta capturar la fila con los valores antiguos devuelve un @@FETCH_STATUS
de -2
. Los nuevos valores son visibles si la actualización se produce a través del cursor especificando la WHERE CURRENT OF
cláusula .
DYNAMIC
Define un cursor que refleja en su conjunto de resultados todos los cambios realizados en los datos de las filas cuando el propietario del cursor se desplaza por éste. Los valores de los datos, el orden y la pertenencia de las filas pueden cambiar en cada captura. Las opciones de captura absoluta y relativa no se pueden utilizar en los cursores dinámicos.
FAST_FORWARD
Especifica un FORWARD_ONLY
cursor , READ_ONLY
con optimizaciones habilitadas. FAST_FORWARD
no se puede especificar cuando SCROLL
también se especifica.
READ_ONLY
Impide que se realicen actualizaciones a través de este cursor. No se puede hacer referencia al cursor en una WHERE CURRENT OF
cláusula de una UPDATE
instrucción o DELETE
. Esta opción reemplaza la capacidad predeterminada de actualizar el cursor.
SCROLL LOCKS
Especifica que existan garantías de que las actualizaciones o las cancelaciones posicionadas realizadas a través del cursor se lleven a cabo correctamente. SQL Server bloquea las filas mientras se leen en el cursor para garantizar su disponibilidad en modificaciones posteriores. No se puede especificar SCROLL_LOCKS
cuándo FAST_FORWARD
también se especifica.
OPTIMISTIC
Especifica que las actualizaciones o las cancelaciones posicionadas realizadas a través del cursor no se lleven a cabo correctamente si la fila se actualizó desde su lectura en el cursor. SQL Server no bloquea las filas cuando se leen en el cursor. En su lugar, utiliza comparaciones de valores de columna timestamp o un valor de suma de comprobación si la tabla no tiene columnas timestamp, para determinar si la fila se modificó tras su lectura en el cursor. Si la fila se ha modificado, la actualización o eliminación posicionada fracasa. No se puede especificar OPTIMISTIC
cuándo FAST_FORWARD
también se especifica.
TYPE_WARNING
Especifica que se envía un mensaje de advertencia al cliente si el cursor se convierte implícitamente del tipo solicitado a otro.
FOR select_statement
Instrucción estándar SELECT
que define el conjunto de resultados del cursor. Las palabras clave FOR BROWSE
y INTO
no se permiten dentro de la select_statement de una declaración de cursor.
Si usa , , o , o incluye una expresión de agregado en el select_list, el cursor se crea como STATIC
.HAVING
GROUP BY
UNION
DISTINCT
Si cada tabla subyacente no tiene un índice único y un cursor ISO SCROLL
o si se solicita un cursor transact-SQL KEYSET
, el cursor es automáticamente un STATIC
cursor.
Si select_statement contiene una ORDER BY
cláusula en la que las columnas no son identificadores de fila únicos, un DYNAMIC
cursor se convierte en un KEYSET
cursor o en un STATIC
cursor si no se puede abrir un KEYSET
cursor. Este proceso también se produce para un cursor definido mediante la sintaxis ISO, pero sin la STATIC
palabra clave .
READ ONLY
Impide que se realicen actualizaciones a través de este cursor. No se puede hacer referencia al cursor en una WHERE CURRENT OF
cláusula de una UPDATE
instrucción o DELETE
. Esta opción reemplaza la capacidad predeterminada de actualizar el cursor. Esta palabra clave varía de la anterior READ_ONLY
, ya que tiene un espacio en lugar de un carácter de subrayado entre READ
y ONLY
.
UPDATE [ OF column_name [ ,... n ] ]
Define las columnas actualizables en el cursor. Si se especifica OF <column_name> [ , ...n ]
, solo las columnas enumeradas admiten modificaciones. Cuando no se proporciona ninguna lista, se pueden actualizar todas las columnas, a menos que el cursor se defina como READ_ONLY
.
Comentarios
Una vez declarada una variable, se inicializa en NULL
. Use la SET
instrucción para asignar un valor que no NULL
sea a una variable declarada. La SET
instrucción que asigna un valor a la variable devuelve un valor único. Al inicializar varias variables, use una instrucción independiente SET
para cada variable local.
Solo puede utilizar las variables en expresiones y no en lugar de nombres de objeto o palabras clave. Para construir instrucciones Transact-SQL dinámicas, use EXECUTE
.
Aunque las reglas de sintaxis para SET @cursor_variable
incluyen las LOCAL
palabras clave y GLOBAL
, cuando se usa la SET @cursor_variable = CURSOR...
sintaxis , el cursor se crea como GLOBAL
o LOCAL
, dependiendo de la configuración del valor predeterminado para la opción de base de datos de cursor local.
Las variables de cursor son siempre locales, incluso cuando hacen referencia a un cursor global. Cuando una variable de cursor hace referencia a un cursor global, éste tiene a la vez una referencia de cursor global y otra local. Para obtener más información, vea Ejemplo D, Uso de SET con un cursor global.
Para más información, vea DECLARE CURSOR (Transact-SQL).
Puede usar el operador de asignación compuesta en cualquier lugar donde tenga una asignación con una expresión en el lado derecho del operador, incluidas las variables y un SET
en una UPDATE
instrucción , SELECT
y RECEIVE
.
No use una variable en una SELECT
instrucción para concatenar valores (es decir, para calcular valores agregados). Los resultados inesperados de la consulta pueden producirse porque todas las expresiones de la SELECT
lista (incluidas las asignaciones) no se ejecutan necesariamente una vez para cada fila de salida. Para obtener más información, consulte KB 287515.
Permisos
Debe pertenecer al rol public . Todos los usuarios pueden usar SET @local_variable
.
Ejemplos
Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022
o AdventureWorksDW2022
, que se puede descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.
A Imprimir el valor de una variable inicializada mediante SET
En el siguiente ejemplo se crea la variable @myVar
, se le asigna un valor de cadena y se imprime el valor de @myVar
.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT @myVar;
GO
B. Usar una variable local asignada a un valor mediante SET en una instrucción SELECT
En el ejemplo siguiente se crea una variable local denominada @state
y se usa la variable local en una SELECT
instrucción para buscar el nombre () y el nombre de familia (FirstName
LastName
) de todos los empleados que residen en el estado de Oregon
.
USE AdventureWorks2022;
GO
DECLARE @state CHAR(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;
GO
C. Uso de una asignación compuesta para una variable local
Los dos ejemplos los siguientes producen el mismo resultado. Cada ejemplo crea una variable local denominada @NewBalance
, la multiplica por 10
y, a continuación, muestra el nuevo valor de la variable local en una SELECT
instrucción . El segundo ejemplo utiliza a un operador de asignación compuesta.
/* Example one */
DECLARE @NewBalance INT;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT @NewBalance;
GO
/* Example Two */
DECLARE @NewBalance INT = 10;
SET @NewBalance *= 10;
SELECT @NewBalance;
GO
D. Uso de SET con un cursor global
En el ejemplo siguiente se crea una variable local y después se establece en la variable de cursor el nombre del cursor global.
DECLARE my_cursor CURSOR GLOBAL
FOR SELECT * FROM Purchasing.ShipMethod
DECLARE @my_variable CURSOR ;
SET @my_variable = my_cursor ;
--There is a GLOBAL cursor declared(my_cursor) and a LOCAL variable
--(@my_variable) set to the my_cursor cursor.
DEALLOCATE my_cursor;
GO
--There is now only a LOCAL variable reference
--(@my_variable) to the my_cursor cursor.
E. Definición de un cursor mediante SET
En el ejemplo siguiente se usa la instrucción SET
para definir un cursor.
DECLARE @CursorVar CURSOR;
SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM AdventureWorks2022.HumanResources.vEmployee
WHERE LastName like 'B%';
OPEN @CursorVar;
FETCH NEXT FROM @CursorVar;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM @CursorVar
END;
CLOSE @CursorVar;
DEALLOCATE @CursorVar;
GO
F. Asignación de un valor de una consulta
En el ejemplo siguiente se utiliza una consulta para asignar un valor a una variable.
USE AdventureWorks2022;
GO
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;
GO
G. Asigne un valor a una variable de tipo definida por el usuario modificando una propiedad del tipo.
El ejemplo siguiente establece un valor para el tipo definido por el usuario (UDT) Point
a través de la modificación del valor de la propiedad X
del tipo.
DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO
Obtenga más información sobre cómo crear el UDT Point
al que se hace referencia en este ejemplo y los ejemplos siguientes del artículo Crear tipos definidos por el usuario.
H. Asigne un valor a una variable de tipo definida por el usuario invocando un método del tipo
En el siguiente ejemplo se establece un valor para el tipo definido por el usuario point a través de la invocación del método SetXY
del tipo.
DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);
I. Crear una variable para un tipo CLR y llamar a un método mutador
En el ejemplo siguiente se crea una variable para el tipo Point
y, a continuación, se ejecuta un método mutador en Point
.
CREATE ASSEMBLY mytest FROM 'c:\test.dll' WITH PERMISSION_SET = SAFE
CREATE TYPE Point EXTERNAL NAME mytest.Point
GO
DECLARE @p Point = CONVERT(Point, '')
SET @p.SetXY(22, 23);
Ejemplos: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)
Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022
o AdventureWorksDW2022
, que se puede descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.
J. Imprimir el valor de una variable inicializada mediante SET
En el siguiente ejemplo se crea la variable @myVar
, se le asigna un valor de cadena y se imprime el valor de @myVar
.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT TOP 1 @myVar FROM sys.databases;
K. Usar una variable local asignada a un valor mediante SET en una instrucción SELECT
En el ejemplo siguiente se crea una variable local denominada @dept
y se usa esta variable local en una SELECT
instrucción para buscar el nombre () y el nombre de familia (FirstName
LastName
) de todos los empleados que trabajan en el Marketing
departamento.
DECLARE @dept CHAR(25);
SET @dept = N'Marketing';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name
FROM DimEmployee
WHERE DepartmentName = @dept;
L. Uso de una asignación compuesta para una variable local
Los dos ejemplos los siguientes producen el mismo resultado. Crean una variable local denominada @NewBalance
, la multiplican por 10
y muestran el nuevo valor de la variable local en una instrucción SELECT
. El segundo ejemplo utiliza a un operador de asignación compuesta.
/* Example one */
DECLARE @NewBalance INT;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT TOP 1 @NewBalance
FROM sys.tables;
/* Example Two */
DECLARE @NewBalance INT = 10;
SET @NewBalance *= 10;
SELECT TOP 1 @NewBalance
FROM sys.tables;
M. Asignación de un valor de una consulta
En el ejemplo siguiente se utiliza una consulta para asignar un valor a una variable.
-- Uses AdventureWorks
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM dbo.DimCustomer);
SELECT TOP 1 @rows FROM sys.tables;