En T-SQL, una variable local es un objeto de memoria temporal con un nombre definido y un tipo de dato específico, diseñado para almacenar un valor de forma transitoria durante la ejecución de un script o lote de sentencias.
Hasta este punto, hemos escrito consultas que son estáticas. Ejecutas una sentencia y obtienes un resultado. Pero el mundo real requiere lógica: “Si pasa esto, haz aquello”, “guarda este valor para usarlo luego”, “repite esto 10 veces”.
Para lograr esto, T-SQL nos ofrece herramientas de programación procedimental. La primera y más fundamental es el uso de la memoria temporal, es decir, las Variables.
Una variable no es más que un contenedor con un nombre, donde guardamos un dato temporalmente para usarlo más tarde dentro de nuestro script.
Imagina que quieres buscar todos los pedidos de un cliente específico. Podrías escribir el ID del cliente 10 en cinco sitios diferentes de tu consulta. Pero si luego quieres buscar al cliente 20, tendrías que cambiarlo en cinco sitios.
Con una variable, guardas el ID en un solo lugar (@ClienteID) y usas ese nombre en el resto del código.
Declaración de variables (DECLARE)
En T-SQL, todas las variables locales deben cumplir dos reglas:
- Su nombre debe empezar por una arroba (@).
- Deben declararse antes de usarse con la palabra clave DECLARE.
-- Sintaxis: DECLARE @Nombre TipoDeDato;
DECLARE @Edad INT;
DECLARE @NombreCliente VARCHAR(100);
DECLARE @FechaInicio DATETIME;
Cuando declaras una variable, su valor inicial por defecto es siempre NULL.
Desde versiones recientes de SQL Server, puedes declarar e inicializar (dar valor) en la misma línea:
DECLARE @Impuesto DECIMAL(10, 2) = 0.21;
Asignación de valores: SET vs SELECT
Existen dos formas de meter datos en una variable una vez declarada. Aunque parecen hacer lo mismo, tienen diferencias importantes.
SET (El estándar)
Es la forma recomendada por el estándar ANSI. Solo permite asignar una variable a la vez.
DECLARE @Precio DECIMAL(10,2);
SET @Precio = 100.50;
SELECT (La forma T-SQL)
Es específica de SQL Server. Permite asignar múltiples variables en una sola sentencia y es muy útil para guardar resultados de consultas.
DECLARE @Nombre VARCHAR(50);
DECLARE @Apellido VARCHAR(50);
-- Asignamos las dos a la vez sacando datos de una tabla
SELECT
@Nombre = Nombre,
@Apellido = Apellido
FROM Empleados
WHERE EmpleadoID = 1;
Usa SET para valores simples y SELECT solo cuando necesites sacar datos de una tabla.
Uso de variables en consultas
Una vez que la variable tiene valor, puedes usarla en WHERE, INSERT, UPDATE o incluso para imprimir mensajes.
Ejemplo: Script de filtrado dinámico
DECLARE @CiudadBusqueda VARCHAR(50);
DECLARE @FechaLimite DATE;
-- Configuramos los parámetros aquí
SET @CiudadBusqueda = 'Madrid';
SET @FechaLimite = '2023-01-01';
-- Usamos las variables en la consulta
SELECT * FROM Pedidos P
INNER JOIN Clientes C ON P.ClienteID = C.ClienteID
WHERE C.Ciudad = @CiudadBusqueda
AND P.FechaPedido >= @FechaLimite;
El ámbito de la variable
Una variable local solo “vive” dentro del Lote (Batch) en el que se ejecuta. En SQL Server Management Studio (SSMS), un lote suele estar delimitado por el comando separador GO.
DECLARE @MiNumero INT = 10;
SELECT @MiNumero;
GO -- Aquí termina el lote. La variable @MiNumero se destruye.
SELECT @MiNumero; -- ⛔ ¡ERROR! La variable no está declarada.
Si intentas ejecutar la segunda parte, SQL Server te dirá:
Must declare the scalar variable “@MiNumero”.
Esto significa que no puedes declarar una variable en una pestaña y usarla en otra, ni siquiera en la misma pestaña si hay un GO de por medio.
