Compartir vía


Variables (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

Una variable local de Transact-SQL es un objeto que contiene un valor individual de datos de un tipo específico. Normalmente, las variables se utilizan en lotes y scripts:

  • Como contador para contar el número de veces que se realiza un bucle, o para controlar cuántas veces se realiza el bucle.
  • Para contener un valor de datos que desea probar mediante una instrucción de control de flujo.
  • Para guardar el valor de un dato que se va a devolver en un código de retorno de un procedimiento almacenado o un valor devuelto de una función.

Comentarios

Los nombres de algunas funciones del sistema Transact-SQL comienzan por dos arrobas (@@). Aunque en versiones anteriores de SQL Server, las @@ funciones se conocen como variables globales, @@ las funciones no son variables y no tienen los mismos comportamientos que las variables. Las @@ funciones son funciones del sistema y su uso de sintaxis sigue las reglas de las funciones.

No se pueden usar variables en una vista.

Los cambios en las variables no se ven afectados por la reversión de una transacción.

Declaración de una variable transact-SQL

La DECLARE instrucción inicializa una variable transact-SQL mediante:

  • Asignar un nombre. El nombre debe tener un único @ como primer carácter.

  • Asignar un tipo de datos suministrado por el sistema o definido por el usuario y una longitud. Para las variables numéricas, se asignan también una precisión y una escala. En el caso de las variables de tipo XML, se puede asignar una colección de esquemas opcional.

  • Establecer el valor en NULL.

Por ejemplo, la siguiente DECLARE instrucción crea una variable local denominada @mycounter con un tipo de datos int . De forma predeterminada, el valor de esta variable es NULL.

DECLARE @MyCounter INT;

Para declarar más de una variable local, use una coma después de la primera variable local definida y, a continuación, especifique el nombre y tipo de datos de la siguiente variable local.

Por ejemplo, la siguiente DECLARE instrucción crea tres variables locales denominadas @LastName, @FirstName y @StateProvince, e inicializa cada una en NULL:

DECLARE @LastName NVARCHAR(30), @FirstName NVARCHAR(20), @StateProvince NCHAR(2);

El ámbito de una variable es el conjunto de instrucciones de Transact-SQL que pueden hacer referencia a la variable. El ámbito de una variable dura desde el punto que se declara hasta el final del lote o procedimiento almacenado en el que se declara. Por ejemplo, el siguiente script genera un error de sintaxis porque la variable se declara en un lote (separado por la GO palabra clave) y se hace referencia a ellos en otro:

USE AdventureWorks2022;
GO

DECLARE @MyVariable INT;

SET @MyVariable = 1;
GO

SELECT BusinessEntityID,
    NationalIDNumber,
    JobTitle
FROM HumanResources.Employee
WHERE BusinessEntityID = @MyVariable;

Las variables tienen ámbito local y solo son visibles dentro del lote o procedimiento donde se definen. En el ejemplo siguiente, el ámbito anidado creado para la ejecución de sp_executesql no tiene acceso a la variable declarada en el ámbito superior y devuelve y produce un error.

DECLARE @MyVariable INT;
SET @MyVariable = 1;
EXECUTE sp_executesql N'SELECT @MyVariable'; -- this produces an error

Establecer un valor en una variable transact-SQL

Cuando se declara por primera vez una variable, su valor se establece en NULL. Para asignar un valor a una variable, use la SET instrucción . Éste es el método preferido para asignar un valor a una variable. Una variable también puede tener asignado un valor al hacer referencia en la lista de selección de una SELECT instrucción.

Para asignar un valor a una variable mediante la instrucción SET, incluya el nombre de la variable y el valor que desea asignar a la misma. Éste es el método preferido para asignar un valor a una variable. Por ejemplo, en el lote siguiente se declaran dos variables, se les asigna un valor y, a continuación, se utilizan en la cláusula WHERE de una instrucción SELECT:

USE AdventureWorks2022;
GO

-- Declare two variables.
DECLARE @FirstNameVariable NVARCHAR(50),
    @PostalCodeVariable NVARCHAR(15);

-- Set their values.
SET @FirstNameVariable = N'Amy';
SET @PostalCodeVariable = N'BA5 3HX';

-- Use them in the WHERE clause of a SELECT statement.
SELECT LastName,
    FirstName,
    JobTitle,
    City,
    StateProvinceName,
    CountryRegionName
FROM HumanResources.vEmployee
WHERE FirstName = @FirstNameVariable
    OR PostalCode = @PostalCodeVariable;
GO

También se puede asignar un valor a una variable si se hace referencia a la misma en una lista de selección. Si se hace referencia a una variable en una lista de selección, se le debe asignar un valor escalar o la SELECT instrucción solo debe devolver una fila. Por ejemplo:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

SELECT @EmpIDVariable = MAX(EmployeeID)
FROM HumanResources.Employee;
GO

Advertencia

Si hay varias cláusulas de asignación en una sola SELECT instrucción, SQL Server no garantiza el orden de evaluación de las expresiones. Los efectos solo son visibles si hay referencias entre las asignaciones.

Si una SELECT instrucción devuelve más de una fila y la variable hace referencia a una expresión nocalar, la variable se establece en el valor devuelto para la expresión en la última fila del conjunto de resultados. Por ejemplo, en el siguiente lote @EmpIDVariable se establece en el BusinessEntityID valor de la última fila devuelta, que es 1:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

SELECT @EmpIDVariable = BusinessEntityID
FROM HumanResources.Employee
ORDER BY BusinessEntityID DESC;

SELECT @EmpIDVariable;
GO

Ejemplo

Este script crea una pequeña tabla de prueba y la rellena con 26 filas. El script usa una variable para hacer tres cosas:

  • Controlar cuántas filas se insertan al comprobar cuántas veces se ejecuta el bucle.
  • Suministrar el valor insertado en la columna de enteros.
  • Funcionar como parte de la expresión que genera cartas que se van a insertar en la columna de caracteres.
-- Create the table.
CREATE TABLE TestTable (cola INT, colb CHAR(3));
GO

SET NOCOUNT ON;
GO

-- Declare the variable to be used.
DECLARE @MyCounter INT;

-- Initialize the variable.
SET @MyCounter = 0;

-- Test the variable to see if the loop is finished.
WHILE (@MyCounter < 26)
BEGIN;
    -- Insert a row into the table.
    INSERT INTO TestTable
    VALUES
        -- Use the variable to provide the integer value
        -- for cola. Also use it to generate a unique letter
        -- for each row. Use the ASCII function to get the
        -- integer value of 'a'. Add @MyCounter. Use CHAR to
        -- convert the sum back to the character @MyCounter
        -- characters after 'a'.
        (
        @MyCounter,
        CHAR((@MyCounter + ASCII('a')))
        );

    -- Increment the variable to count this iteration
    -- of the loop.
    SET @MyCounter = @MyCounter + 1;
END;
GO

SET NOCOUNT OFF;
GO

-- View the data.
SELECT cola, colb FROM TestTable;
GO

DROP TABLE TestTable;
GO