SET @local_variable (Transact-SQL)
Establece en el valor especificado la variable local indicada, creada previamente con la instrucción DECLARE @local\_variable.
Convenciones de sintaxis de Transact-SQL
Sintaxis
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 [ 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 ] ] } ]
}
}
}
Argumentos
@ local_variable
Es el nombre de una variable de cualquier tipo, excepto cursor, text, ntext, image o table. Los nombres de variables deben comenzar con un signo arroba (@). Los nombres de variable deben seguir las reglas de los identificadores.property_name
Es el nombre de una propiedad definida por el usuario.field_name
Es un campo público de un tipo definido por el usuario.udt_name
Es 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. En métodos de instancia (no estáticos), utilice un punto (.). En métodos estáticos, utilice dos puntos dobles (::). 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 ( argument [ ,... n ] )
Es 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
Es una variable cuyo tipo se encuentra en un ensamblado. Para obtener más información, vea Conceptos de programación en el ámbito de la integración de Common Language Runtime (CLR).mutator_method
Es un método del ensamblado que puede cambiar el estado del objeto. SQLMethodAttribute.IsMutator se aplicará a este método.{ += | -= | *= | /= | %= | &= | ^= | |= }
Operador de asignación compuesta:+= Sumar y asignar
-= Restar y asignar
*= Multiplicar y asignar
/= Dividir y asignar
%= Módulo y asignar
&= AND bit a bit y asignar
^= XOR bit a bit y asignar
|= OR bit a bit y asignar
expression
Es cualquier expresión válida.cursor_variable
Es el 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
Es el nombre de un cursor declarado con la instrucción DECLARE CURSOR.CURSOR
Especifica que la instrucción SET 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 es posible especificar SCROLL si se incluye también FAST_FORWARD.FORWARD_ONLY
Especifica que el cursor solo admite la opción FETCH NEXT. El cursor solo se puede recuperar en una dirección, desde la primera fila hacia la última. Si se especifica FORWARD_ONLY sin las palabras clave STATIC, KEYSET o DYNAMIC, el cursor se implementa como DYNAMIC. Cuando no se especifica FORWARD_ONLY ni SCROLL, FORWARD_ONLY es la opción predeterminada, salvo que se incluyan las palabras clave STATIC, KEYSET o DYNAMIC. Los cursores STATIC, KEYSET y DYNAMIC toman como valor predeterminado SCROLL.STATIC
Define un cursor que hace una copia temporal de los datos que utiliza. Todas las solicitudes que se realizan al cursor se responden desde esta tabla temporal de tempdb; por tanto, las modificaciones realizadas en las tablas base no se reflejan en los datos devueltos por las operaciones de captura realizadas en el cursor y además 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 identifica de forma única las filas está integrado en la tabla keysetde 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 para capturar la fila devuelve un @@FETCH_STATUS de -2. Las actualizaciones de valores de clave de 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, y los intentos de capturar la fila con los valores anteriores devuelven un @@FETCH_STATUS de -2. Los nuevos valores están visibles si la actualización se realiza a través del cursor especificando la cláusula WHERE CURRENT OF.
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 cursor FORWARD_ONLY, READ_ONLY con las optimizaciones habilitadas. No es posible especificar FAST_FORWARD si también se incluye SCROLL.READ_ONLY
Impide que se realicen actualizaciones a través de este cursor. No es posible hacer referencia al cursor en una cláusula WHERE CURRENT OF de una instrucción UPDATE 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 es posible especificar SCROLL_LOCKS si se incluye también FAST_FORWARD.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 ha actualizado desde que se leyó 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 ha modificado después de leerla en el cursor. Si la fila se ha modificado, la actualización o eliminación posicionada fracasa. No es posible especificar OPTIMISTIC si se incluye también FAST_FORWARD.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
Es una instrucción SELECT estándar que define el conjunto de resultados del cursor. Las palabras clave FOR BROWSE e INTO no están permitidas en la instrucción select_statement de una declaración de cursor.Si se utiliza DISTINCT, UNION, GROUP BY o HAVING, o si se incluye una expresión de agregado en select_list, el cursor se creará como STATIC.
Si ninguna de las tablas subyacentes tiene un índice único y se solicita un cursor ISO SCROLL o Transact-SQL KEYSET, éste será automáticamente un cursor de tipo STATIC.
Si select_statement contiene una cláusula ORDER BY y las columnas indicadas no son identificadores de fila únicos, los cursores DYNAMIC se convertirán en cursores KEYSET o en cursores STATIC, si no es posible abrir un cursor KEYSET. Lo mismo ocurre en el caso de un cursor definido con la sintaxis ISO, pero sin la palabra clave STATIC.
READ ONLY
Impide que se realicen actualizaciones a través de este cursor. No es posible hacer referencia al cursor en una cláusula WHERE CURRENT OF de una instrucción UPDATE o DELETE. Esta opción reemplaza la capacidad predeterminada de actualizar el cursor. Esta palabra clave varía con respecto a la READ_ONLY anterior en que contiene 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 admitirán modificaciones las columnas enumeradas. Si no se especifica ninguna lista, se podrán actualizar todas las columnas, a menos que el cursor se haya definido como READ_ONLY.
Comentarios
Después de declarada una variable, ésta se inicializa en NULL. Puede usar la instrucción SET para asignar a una variable declarada un valor distinto de NULL. La instrucción SET que asigna un valor a la variable devuelve un solo valor. Cuando inicialice varias variables, utilice una instrucción SET distinta para cada variable local.
Las variables solo se pueden utilizar en expresiones y no en lugar de nombres de objeto o palabras clave. Para formar instrucciones Transact-SQL dinámicas, utilice EXECUTE.
Las reglas de sintaxis de SET **@**cursor_variable no incluyen las palabras clave LOCAL y GLOBAL. Cuando se utiliza la sintaxis SET **@**cursor_variable = CURSOR... , el cursor se crea como GLOBAL o LOCAL en función del valor de la opción default to local cursor de la base de datos.
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 el ejemplo C.
Para obtener más información, vea DECLARE CURSOR (Transact-SQL).
Se puede utilizar el operador de asignación compuesta en cualquier lugar donde haya una asignación con una expresión en el lado derecho del operador, incluso las variables, y un SET en una instrucción UPDATE, SELECT y RECEIVE.
No use una variable en una instrucción SELECT para concatenar valores (es decir, para calcular valores de agregado). Pueden producirse resultados de consulta inesperados. Esto se debe a que no se garantiza que todas las expresiones de la lista de SELECT (incluidas las asignaciones) se ejecuten exactamente una vez por cada fila de salida. Para obtener más información, vea este artículo de KB.
Permisos
Necesita la pertenencia al rol public. Todos los usuarios pueden utilizar SET **@**local_variable.
Ejemplos
A.Imprimir el valor de una variable inicializada con SET
En el ejemplo siguiente 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.Utilizar en una instrucción SELECT una variable local a la que se ha asignado un valor con SET
En el ejemplo siguiente se crea una variable local llamada @state que después se usa en una instrucción SELECT para buscar todos los nombres y apellidos de los empleados residentes en el estado de Oregon.
USE AdventureWorks2012;
GO
DECLARE @state char(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;
C.Utilizar 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 @NewBalance;
/* Example Two */
DECLARE @NewBalance int = 10;
SET @NewBalance *= 10;
SELECT @NewBalance;
D.Utilizar 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;
--There is now only a LOCAL variable reference
--(@my_variable) to the my_cursor cursor.
E.Definir un cursor con 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 AdventureWorks2012.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;
F.Asignar un valor desde una consulta
En el ejemplo siguiente se utiliza una consulta para asignar un valor a una variable.
USE AdventureWorks2012;
GO
DECLARE @rows int;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;
G.Asignar un valor a una variable de tipo definido por el usuario mediante la modificación de una propiedad del tipo
El ejemplo siguiente establece un valor para el tipo definido por el usuario 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
H.Asignar un valor a una variable de tipo definido por el usuario mediante la invocación de un método del tipo
El ejemplo siguiente 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);