SET @local_variable (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de análisis SQL en Microsoft FabricAlmacenamiento en 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

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

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 a AND bit y asignar
  • ^= - Bit a XOR bit y asignar
  • |= - Bit a OR 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, RELATIVEy 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 STATICpalabras clave , KEYSETo DYNAMIC , el cursor se implementa como DYNAMIC. Si no especifica o FORWARD_ONLYSCROLL, FORWARD_ONLY es el valor predeterminado, a menos que especifique las palabras clave STATIC, KEYSETo DYNAMIC. En el caso STATICde los cursores , KEYSETy 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_ONLYcursor , 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 BROWSEy 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.HAVINGGROUP BYUNIONDISTINCT

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 UPDATEinstrucción , SELECTy 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

Este artículo requiere la base de datos de ejemplo AdventureWorks2022 que se puede descargar de 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 (FirstNameLastName) 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 10y, 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)

Este artículo requiere la base de datos de ejemplo AdventureWorks2022 que se puede descargar de 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 (FirstNameLastName) 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;