DECLARE, SET y asignación con SELECT: trabajar con variables
Una consulta reutilizable no debería obligarnos a modificar valores dispersos dentro del código. Una variable conserva un valor bajo un nombre durante su alcance. Puede representar una fecha, un identificador, un límite o un resultado intermedio dentro del lote —el grupo de instrucciones enviado junto a SQL Server— o del procedimiento.
DECLARE crea la variable. SET y SELECT pueden asignarle valores, pero no se comportan igual en todos los casos.
Construcciones para variables
DECLARE: crear una variable
DECLARE crea el nombre y establece el tipo de dato que la variable puede recibir. También puede asignar un valor inicial en la misma instrucción.
DECLARE @Variable TipoDeDato;
DECLARE @OtraVariable TipoDeDato = ValorInicial;
SET: asignar un valor
SET asigna una expresión a una variable ya declarada. La expresión puede ser un valor, un cálculo o una subconsulta que devuelva un solo valor.
SET @Variable = Expresion;
SELECT: asignar desde una consulta
SELECT puede asignar una o varias variables con los valores producidos por una consulta. Debemos controlar cuántas filas puede devolver porque la asignación puede repetirse si llegan varias.
SELECT
@Variable1 = Expresion1,
@Variable2 = Expresion2
FROM dbo.Tabla
WHERE Condicion;
Declarar y asignar
DECLARE @IdCategoria SMALLINT;
DECLARE @PrecioMaximo DECIMAL(12, 2);
SET @IdCategoria = 1;
SET @PrecioMaximo = 500.00;
El nombre comienza con @ y el tipo define qué valores puede recibir. También podemos declarar e inicializar en una sola línea:
DECLARE @FechaDesde DATE = '2026-03-01';
Ejemplo: utilizar variables en una consulta
DECLARE @IdCategoria SMALLINT = 1;
DECLARE @PrecioMaximo DECIMAL(12, 2) = 500.00;
SELECT
p.IdProducto,
p.Nombre,
p.Precio
FROM dbo.Producto AS p
WHERE p.IdCategoria = @IdCategoria
AND p.Precio <= @PrecioMaximo
ORDER BY p.Precio;
Las variables viven únicamente dentro de su alcance, la parte de la ejecución donde el nombre existe. No son parámetros recibidos automáticamente desde una aplicación; un procedimiento debe declararlos como parte de su firma, la lista de parámetros que acepta.
Asignar el resultado de una consulta
SET puede recibir una subconsulta escalar, es decir, una consulta que devuelve un solo valor:
DECLARE @PrecioPromedio DECIMAL(12, 2);
SET @PrecioPromedio =
(
SELECT AVG(p.Precio)
FROM dbo.Producto AS p
WHERE p.Activo = 1
);
SELECT @PrecioPromedio AS PrecioPromedio;
SELECT permite asignar varias variables en la misma consulta:
DECLARE @CantidadProductos INT;
DECLARE @PrecioMayor DECIMAL(12, 2);
SELECT
@CantidadProductos = COUNT(*),
@PrecioMayor = MAX(p.Precio)
FROM dbo.Producto AS p
WHERE p.Activo = 1;
Diferencias importantes
Si una subconsulta escalar utilizada por SET devuelve varias filas, SQL Server genera un error. Una asignación mediante SELECT @Variable = Columna FROM ... puede asignar repetidamente y terminar con uno de los valores procesados; sin un diseño que garantice una sola fila, el resultado no representa una elección confiable.
Cuando una asignación con SELECT no encuentra filas, la variable puede conservar su valor anterior. Por eso no debemos utilizarla como si siempre asignara NULL automáticamente.
Qué conviene comprobar
El tipo de la variable debe coincidir con el dato que representa. Una longitud insuficiente puede truncar texto —perder los caracteres que no caben— y una escala inadecuada, la cantidad de dígitos decimales, puede redondear números.
También distinguimos una variable local de un parámetro y de una columna. Utilizar prefijos descriptivos como @FechaDesde o @IdCliente facilita reconocer la intención sin agregar comentarios innecesarios.