Published on

November 12, 2020

Usando Variables en SQL Server: Una Guía Completa

SQL Server permite a los desarrolladores almacenar, recuperar y manipular datos utilizando el lenguaje SQL. Sin embargo, a medida que los scripts y los procedimientos almacenados se vuelven más complejos, puede resultar desafiante gestionar y manipular datos sin variables.

Sin variables, los desarrolladores pueden necesitar repetir consultas o cálculos complejos varias veces dentro de un script, lo que resulta en un código inflado y difícil de leer propenso a errores. Además, no utilizar variables puede dificultar el manejo efectivo de errores, ya que los desarrolladores pueden necesitar repetir el mismo código de manejo de errores varias veces dentro de un script. Esto puede resultar en un código difícil de mantener y dificulta la identificación y corrección de errores cuando ocurren.

En este tutorial, discutiremos el concepto de usar variables en SQL Server, junto con varios ejemplos para demostrar su uso.

Declarando una Variable SQL Individual

La sintaxis T-SQL para declarar una variable en SQL Server es la siguiente:

DECLARE @nombre_variable tipo_de_dato [= valor];

Por ejemplo, declaremos una variable llamada @ProductID de tipo de dato entero y asignemos un valor estático de 778:

DECLARE @ProductID int = 778;

SELECT [SalesOrderID], [CarrierTrackingNumber], [OrderQty], [ProductID], [SpecialOfferID], [UnitPrice], [LineTotal]
FROM [AdventureWorks2019].[Sales].[SalesOrderDetail]
WHERE ProductID = @ProductID;

También puedes asignar el valor más tarde utilizando la palabra clave SET:

DECLARE @ProductID int;

SET @ProductID = 778;

SELECT [SalesOrderID], [CarrierTrackingNumber], [OrderQty], [ProductID], [SpecialOfferID], [UnitPrice], [LineTotal]
FROM [AdventureWorks2019].[Sales].[SalesOrderDetail]
WHERE ProductID = @ProductID;

Puedes usar variables con diferentes tipos de datos, como caracteres, fechas y decimales:

DECLARE @employee_name VARCHAR(50);
SET @employee_name = 'Rajendra';

DECLARE @current_date DATE = GETDATE();

DECLARE @tax_rate DECIMAL(4,2);
SET @tax_rate = 0.04;

Declarando Múltiples Variables en SQL Server

Para declarar múltiples variables, puedes usar diferentes palabras clave DECLARE:

DECLARE @Nombre varchar(50);
DECLARE @Edad tinyint;
DECLARE @DOJ int;

Alternativamente, puedes usar una sola palabra clave DECLARE y separar múltiples variables con una coma:

DECLARE @Nombre varchar(50), @Edad tinyint, @DOJ int;

Asignando Valores Dinámicos a Variables

Puedes establecer el valor de una variable de forma dinámica. Por ejemplo, el siguiente código declara tres variables, @AvgUnitPrice, @AvgOrderQty y @AvgLineTotal. La instrucción SELECT calcula el precio unitario promedio, la cantidad de pedido promedio y el total de línea promedio, y asigna estos valores calculados a las variables:

DECLARE @AvgUnitPrice int, @AvgOrderQty int, @AvgLineTotal int;

SELECT @AvgUnitPrice = Avg(UnitPrice), @AvgOrderQty = Avg(OrderQty), @AvgLineTotal = Avg(LineTotal)
FROM [AdventureWorks2019].[Sales].[SalesOrderDetail];

SELECT @AvgUnitPrice as AvgLineTotal, @AvgOrderQty as AvgOrderQty, @AvgLineTotal as AvgLineTotal;

Usando Variables en Procedimientos Almacenados

Las variables en los procedimientos almacenados proporcionan flexibilidad y control sobre la manipulación de datos. Por ejemplo, el siguiente procedimiento almacenado utiliza dos variables, @JobTitle y @BirthDate. El procedimiento almacenado asigna valores a estas variables e imprime la información requerida utilizando estas variables:

CREATE PROCEDURE dbo.GetPersonInfo
    @NationalIDNumber INT
AS
BEGIN
    DECLARE @JobTitle VARCHAR(50);
    DECLARE @BirthDate date;
 
    SELECT @JobTitle = JobTitle, @BirthDate = BirthDate
    FROM [AdventureWorks2019].[HumanResources].[Employee]
    WHERE [NationalIDNumber] = @NationalIDNumber;
 
    -- Utiliza las variables para procesamiento adicional
    PRINT 'Título del trabajo: ' + @JobTitle;
    PRINT 'Fecha de nacimiento: ' + CAST(@BirthDate AS VARCHAR(10));
END;

EXEC GetPersonInfo 295847284;

Usando Variables en Cursores

Las variables se pueden usar en cursores para almacenar y manipular datos. Por ejemplo, la siguiente consulta declara un cursor, SalesOrder_Cursor, y obtiene el número de orden de venta, el total adeudado y el ID del vendedor de la base de datos AdventureWorks2019. El cursor itera a través de los IDs de orden de venta, asigna la información obtenida a las variables @SalesOrderNumber, @TotalDue y @SalesPersonID, e imprime esta información con mensajes específicos:

DECLARE @SalesOrderID int = 71951;
DECLARE @SalesOrderNumber varchar(20);
DECLARE @TotalDue DECIMAL(10, 2);
DECLARE @SalesPersonID varchar(20);

DECLARE SalesOrder_Cursor CURSOR FOR
SELECT SalesOrderNumber, TotalDue, SalesPersonID
FROM [AdventureWorks2019].[Sales].[SalesOrderHeader]
WHERE SalesOrderID >= @SalesOrderID AND SalesPersonID IS NOT NULL;

OPEN SalesOrder_Cursor;

FETCH NEXT FROM SalesOrder_Cursor INTO @SalesOrderNumber, @TotalDue, @SalesPersonID;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- Realiza operaciones utilizando las variables
    PRINT 'ID del vendedor: ' + @SalesPersonID;
    PRINT 'Orden de venta: ' + CAST(@SalesOrderNumber AS VARCHAR(10));
    PRINT 'Total adeudado: ' + CAST(@TotalDue AS VARCHAR(10));

    -- Obtén el siguiente conjunto de datos del cursor
    FETCH NEXT FROM SalesOrder_Cursor INTO @SalesOrderNumber, @TotalDue, @SalesPersonID;
END;

CLOSE SalesOrder_Cursor;
DEALLOCATE SalesOrder_Cursor;

Usando Variables para Crear Declaraciones SQL Dinámicas

Las variables se pueden utilizar para crear declaraciones SQL dinámicas combinando varias partes de las consultas, como nombres de tablas, parámetros y argumentos. Por ejemplo, el siguiente código crea y ejecuta dinámicamente una declaración SQL utilizando el procedimiento almacenado sp_executesql:

DECLARE @table_name VARCHAR(50) = 'SalesOrderHeader';
DECLARE @schema varchar(20) = 'Sales';
DECLARE @SalesOrderID varchar(20) = 71951;
DECLARE @sql_stmt NVARCHAR(MAX);

SET @sql_stmt = 'SELECT * FROM ' + @schema + '.' + QUOTENAME(@table_name) + ' WHERE SalesOrderID =' + @SalesOrderID;

EXEC sp_executesql @sql_stmt;

Usando Variables para Controlar la Ejecución de Bucles

Las variables pueden ayudar a controlar la ejecución de bucles estableciendo condiciones, controlando el contador del bucle y determinando cuándo el bucle debe continuar o salir. Por ejemplo, el siguiente código demuestra un bucle que contiene información sobre un rango de IDs de orden de venta. El bucle comienza desde @SalesOrderIDStart y termina una vez que el valor del ID de orden de venta es igual a @SalesOrderIDEnd. La instrucción SET en el bucle while incrementa el ID de orden de venta en 1:

DECLARE @SalesOrderIDStart INT = 43659, @SalesOrderIDEnd INT = 43759;

WHILE @SalesOrderIDStart <= @SalesOrderIDEnd
BEGIN
    SELECT [AccountNumber], [CustomerID], [SalesPersonID], [TerritoryID], [BillToAddressID], [ShipToAddressID], [ShipMethodID], [CreditCardID], [CreditCardApprovalCode], [TaxAmt], [Freight], [TotalDue]
    FROM [AdventureWorks2019].[Sales].[SalesOrderHeader]
    WHERE SalesOrderID = @SalesOrderIDStart;
    
    SET @SalesOrderIDStart = @SalesOrderIDStart + 1;
END;

Manejo de Errores Utilizando Variables

El manejo de errores es necesario para capturar errores durante la ejecución del código. Por ejemplo, si has definido una clave primaria en la columna ID y alguien intenta insertar un valor duplicado, se produciría un error de violación de clave primaria. El siguiente código utiliza el bloque TRY CATCH para capturar el error debido a la violación de clave primaria. El bloque CATCH asigna el mensaje de error a la variable @ErrorMessage e imprime el mensaje:

CREATE TABLE Employee
(
   ID int PRIMARY KEY,
   First_name varchar(50),
   Country varchar(20)
);

BEGIN TRY
    INSERT INTO Employee Values(1, 'Rajendra', 'India');

    -- Insertar un registro duplicado que generará un error debido a la CLAVE PRIMARIA
    INSERT INTO Employee Values(1, 'Rajendra', 'India');
END TRY

BEGIN CATCH
    -- Declarar variables para almacenar información del error
    DECLARE @ErrorMessage NVARCHAR(MAX);
    SELECT @ErrorMessage = ERROR_MESSAGE();
    PRINT 'Ocurrió un error: ' + @ErrorMessage; 
END CATCH;

Al utilizar variables, puedes manejar errores de manera efectiva y proporcionar mensajes de error apropiados.

Conclusión

Declarar variables en SQL Server permite a los desarrolladores almacenar y manipular datos durante la ejecución de un script o procedimiento almacenado. Las variables son útiles para mantener conjuntos de resultados intermedios, controlar el flujo de trabajo, preparar declaraciones SQL dinámicas y manejar errores. Al utilizar variables de manera efectiva, los desarrolladores pueden escribir un código más eficiente y fácil de mantener.

Última actualización del artículo: 2023-08-16

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.