SET @local_variable (Transact-SQL)

Establece en el valor especificado 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 }
}
|
{ @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 de 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

    %= Hallar el 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.

    [!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. 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 capturas 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 keyset de 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.

    [!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. 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 invalida 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 con posición 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 con posición intentada 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 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, este 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 invalida la capacidad predeterminada de actualizar el cursor. Esta palabra clave varía con respecto a la instrucción 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.

Notas

Después de declarada una variable, esta se inicializa como 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. 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 de valor predeterminado de cursores locales 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.

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 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 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;

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

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

Historial de cambios

Contenido actualizado

Agregado @SQLCLR_local_variable.mutator_method a la sección Sintaxis y descripciones de las variables en la sección Argumentos.

Agregado el ejemplo I.