(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo crear un Stored Procedure en el Warehouse de Microsoft Fabric

João Barros 09 de November de 2026 6 min de lectura

Este tutorial muestra cómo crear un Stored Procedure en el Warehouse de Microsoft Fabric para encapsular lógica T-SQL reutilizable. Un Stored Procedure ayuda a automatizar transformaciones, reducir el tráfico de red y mejorar la gestión de consultas repetidas. En escenarios prácticos, mover agregaciones al servidor puede reducir el volumen de datos transmitido al cliente en más del 90% (por ejemplo, enviar 7 filas de resumen en lugar de 100k filas de detalle), y disminuir la latencia de las consultas de segundos a cientos de milisegundos cuando el Warehouse está bien indexado.

Prerequisitos

  • Cuenta con acceso a Microsoft Fabric y permisos para un Workspace y un Warehouse. Normalmente se necesitan permisos de ejecución SQL en el Warehouse (por ejemplo, un rol que permita ejecutar queries o administración del Warehouse).
  • Familiaridad básica con T-SQL (SELECT, INSERT, UPDATE). Conocimientos mínimos sobre transacciones y controles de concurrencia son útiles.
  • Un Warehouse configurado y online en el Workspace donde va a ejecutar el código. Verifique que el endpoint SQL está activo y que el Warehouse tiene potencia computacional suficiente — por ejemplo, para 1M de filas un Warehouse de tamaño medio suele ejecutar la agregación en decenas de segundos.

Paso 1: Abrir el Warehouse e iniciar una sesión T-SQL

Abra el Workspace en Microsoft Fabric, seleccione su Warehouse y haga clic en "New SQL Script" o "Query" para iniciar una sesión T-SQL. El objetivo es ejecutar el código para crear el Stored Procedure en el contexto del Warehouse. Confirme el contexto de base de datos/schema en la parte superior del editor (por ejemplo, dbo) y, si es necesario, ejecute un USE <DatabaseName> antes de la creación para garantizar que el procedimiento quede en el esquema correcto.

Paso 2: Planificar la lógica del Stored Procedure

Decida qué hará el Stored Procedure. Ejemplo práctico: una rutina que agrega ventas por día e inserta los resultados en una tabla de resumen. Piense en parámetros (p. ej. @StartDate y @EndDate), cardinalidad esperada (una fila por día: 7 filas para una semana, 30 para un mes) y requisitos de idempotencia (ejecutar varias veces no debe crear duplicados). Identifique columnas clave para indexación — en el caso de las ventas, un índice en OrderDate o una partición por fecha puede mejorar mucho el rendimiento en conjuntos de datos con millones de filas.

Paso 3: Crear la tabla de resumen (si es necesario)

Si aún no existe, cree una tabla destino en el mismo esquema del Warehouse para almacenar el resumen diario. Para volúmenes moderados, un esquema simple como el siguiente es suficiente; para volúmenes más altos considere compresión, índices o particiones por mes/año.

CREATE TABLE IF NOT EXISTS dbo.Sales_DailySummary (
  SalesDate date NOT NULL,
  TotalAmount decimal(18,2) NOT NULL,
  TotalOrders int NOT NULL,
  LastUpdated datetime2 NOT NULL
);

Consejo: si espera actualizar frecuentemente, cree un índice en SalesDate para acelerar MERGE/UPDATEs. En pruebas, una tabla de resumen con 10k filas se actualiza en milisegundos, mientras que una fuente con 1M de filas puede tardar 10-60 segundos dependiendo del Warehouse.

Paso 4: Escribir el Stored Procedure

Creé el Stored Procedure con parámetros para la ventana de fecha. Use transacciones y un manejo sencillo de errores para garantizar consistencia. El ejemplo usa MERGE para insertar/actualizar en bloque; esto evita round-trips y es eficiente cuando el número de días en el intervalo es pequeño comparado con las filas de origen.

CREATE OR ALTER PROCEDURE dbo.usp_UpdateDailySalesSummary
  @StartDate date,
  @EndDate date
AS
BEGIN
  SET NOCOUNT ON;
  BEGIN TRY
    BEGIN TRANSACTION;

    -- Calcular resumen e insertar/actualizar en la tabla destino
    MERGE dbo.Sales_DailySummary AS target
    USING (
      SELECT CAST(OrderDate AS date) AS SalesDate,
             SUM(Amount) AS TotalAmount,
             COUNT(1) AS TotalOrders
      FROM dbo.Sales
      WHERE OrderDate BETWEEN @StartDate AND @EndDate
      GROUP BY CAST(OrderDate AS date)
    ) AS src
    ON target.SalesDate = src.SalesDate
    WHEN MATCHED THEN
      UPDATE SET TotalAmount = src.TotalAmount,
                 TotalOrders = src.TotalOrders,
                 LastUpdated = SYSUTCDATETIME()
    WHEN NOT MATCHED THEN
      INSERT (SalesDate, TotalAmount, TotalOrders, LastUpdated)
      VALUES (src.SalesDate, src.TotalAmount, src.TotalOrders, SYSUTCDATETIME());

    COMMIT TRANSACTION;
  END TRY
  BEGIN CATCH
    IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
    DECLARE @ErrMsg nvarchar(4000) = ERROR_MESSAGE();
    THROW 51000, @ErrMsg, 1;
  END CATCH
END;

Notas: controlar XACT_STATE evita dejar transacciones abiertas. El THROW con código 51000 indica un error personalizado; en producción registre el error en tablas de auditoría o logs del Warehouse.

Paso 5: Conceder permisos (opcional)

Si otros usuarios o servicios necesitan ejecutar el Stored Procedure, conceda EXECUTE al rol o usuario apropiado. Para automatizaciones vía service principal, conceda al usuario asociado al servicio.

GRANT EXECUTE ON OBJECT::dbo.usp_UpdateDailySalesSummary TO [YourUserOrRole];

Principio del menor privilegio: otorgue solo EXECUTE si la cuenta no necesita derechos adicionales. En entornos con seguridad más estricta, prefiera roles con permisos controlados.

Paso 6: Ejecutar y probar el Stored Procedure

Llame al Stored Procedure con un intervalo de fechas de prueba. Verifique que la lógica inserta/actualiza correctamente los registros. Pruebe primero con un intervalo corto (p. ej. 7 días) y confirme los tiempos. Si la fuente tiene 100k filas y el Warehouse está dimensionado para cargas medias, espere tiempos entre 5-30 segundos para la agregación.

EXEC dbo.usp_UpdateDailySalesSummary @StartDate = '2026-10-01', @EndDate = '2026-10-07';

-- Verificar resultados
SELECT * FROM dbo.Sales_DailySummary
WHERE SalesDate BETWEEN '2026-10-01' AND '2026-10-07'
ORDER BY SalesDate;

Validaciones útiles: comparar SUM(TotalOrders) con SELECT COUNT(*) FROM dbo.Sales WHERE OrderDate BETWEEN ... para garantizar integridad.

Comprobar el resultado

Confirme que la tabla dbo.Sales_DailySummary contiene filas para cada día del intervalo y que los valores de TotalAmount y TotalOrders coinciden con las agregaciones de la tabla dbo.Sales. Verifique también la columna LastUpdated para asegurarse de que la ejecución fue reciente. Si no hay resultados, revise la condición WHERE (cuidado con timezones y componentes de tiempo en OrderDate) y el formato de fechas; pruebe con CAST/CONVERT si es necesario. Si detecta discrepancias, ejecute SELECTs intermedios para validar la agregación y cuente nulos o filas con fechas inválidas.

Conclusión

Ahora tiene un Stored Procedure en el Warehouse de Microsoft Fabric que agrega ventas por día y mantiene una tabla de resumen. Próximos pasos: programar la ejecución usando un Pipeline en el propio Workspace o automatizar con Azure Logic Apps/Power Automate para actualizaciones periódicas (p. ej. diaria a la 01:00). Monitorice tiempos de ejecución y use índices en OrderDate si los tiempos aumentan. En entornos de producción, pruebe con muestras y monitorice métricas (CPU, tiempo, I/O) — una ejecución diaria típica para 1M de filas puede tardar entre 20-60 segundos dependiendo de la configuración del Warehouse.