SET @local_variable (Transact-SQL)

Establece el valor especificado en la variable local indicada, creada previamente con la instrucción DECLARE **@**local_variable.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

SET 
{ @local_variable 
    [:: property_name | field_name ] = expression | udt_name { . | :: } method_name(argument [ ,...n ] ) 
}
| 
{ @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.

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 recuperación: 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 sólo admite la opción FETCH NEXT. El cursor sólo 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.

[!NOTA] En SQL Server 2000, las opciones de cursor FAST_FORWARD y FORWARD_ONLY se excluyen mutuamente. Si se especifica una de estas opciones, no se puede utilizar la otra ya que, al hacerlo, se produce un error. En SQL Server 2005, las dos palabras clave pueden utilizarse en la misma instrucción DECLARE CURSOR.

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 de tempdb; por ello, las modificaciones realizadas en las tablas base no se reflejarán en los datos obtenidos de las recuperaciones 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 una tabla de tempdb conocida como keyset. 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, el intento de recuperarla obtendrá el valor -2 en @@FETCH_STATUS. Las actualizaciones de los valores de claves desde fuera del cursor se asemejan a la eliminación de la fila antigua seguida de la inserción de la fila nueva. La fila de los nuevos valores no es visible y los intentos de recuperar la fila con los valores antiguos devuelven el valor -2 en @@FETCH_STATUS. Los nuevos valores son visibles si la actualización se realiza a través del cursor, al especificar 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 recuperación. Las opciones de recuperación 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.

[!NOTA] En SQL Server 2000, las opciones de cursor FAST_FORWARD y FORWARD_ONLY se excluyen mutuamente. Si se especifica una de estas opciones, no se puede utilizar la otra ya que, al hacerlo, se produce un error. En SQL Server 2005, las dos palabras clave pueden utilizarse en la misma instrucción DECLARE CURSOR.

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 está garantizado que las actualizaciones o eliminaciones posicionadas, realizadas a través del cursor, se lleven a cabo correctamente. SQL Server bloquea las filas al leerlas en el cursor, lo que asegura su disponibilidad para posteriores modificaciones. No es posible especificar SCROLL_LOCKS si se incluye también FAST_FORWARD.

OPTIMISTIC

Especifica que las actualizaciones o eliminaciones posicionadas realizadas a través del cursor no se llevarán a cabo correctamente si la fila se ha actualizado después de ser leída en el cursor. SQL Server no bloquea las filas al leerlas 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 COMPUTE, COMPUTE BY, FOR BROWSE e INTO no están admitidas en el argumento select_statement en 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 SQL-92 SCROLL o Transact-SQL KEYSET, automáticamente éste será 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 SQL-92, 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], sólo se podrán modificar las columnas incluidas en la lista. Si no se especifica ninguna lista, se podrán actualizar todas las columnas, a menos que el cursor se haya definido como READ_ONLY.

Notas

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 sólo 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. Si 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).

Permisos

Debe pertenecer a la función 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 AdventureWorks;
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 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.

D. 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 AdventureWorks.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;

E. Asignar un valor desde una consulta

En el ejemplo siguiente se utiliza una consulta para asignar un valor a una variable.

USE AdventureWorks;
GO
DECLARE @rows int;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;

F. 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

F. 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);

Vea también

Referencia

DECLARE @local\_variable (Transact-SQL)
EXECUTE (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)

Otros recursos

Expresiones (motor de base de datos)
Usar variables y parámetros (motor de base de datos)

Ayuda e información

Obtener ayuda sobre SQL Server 2005