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

Como criar um Stored Procedure no Warehouse do Microsoft Fabric

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

Este tutorial mostra como criar um Stored Procedure em Warehouse do Microsoft Fabric para encapsular lógica T-SQL reutilizável. Um Stored Procedure ajuda a automatizar transformações, reduzir tráfego de rede e melhorar a gestão de consultas repetidas. Em cenários práticos, mover agregações para o servidor pode reduzir o volume de dados transmitido para o cliente em mais de 90% (por exemplo, enviar 7 linhas de resumo em vez de 100k linhas de detalhe), e diminuir a latência das consultas de segundos para centenas de milissegundos quando o Warehouse está bem indexado.

Pré-requisitos

  • Conta com acesso ao Microsoft Fabric e permissões para um Workspace e um Warehouse. Normalmente precisa de permissões de execução SQL no Warehouse (por exemplo, papel que permita executar queries ou administração do Warehouse).
  • Familiaridade básica com T-SQL (SELECT, INSERT, UPDATE). Conhecimentos mínimos sobre transacções e controlos de concorrência são úteis.
  • Um Warehouse configurado e online no Workspace onde vai executar o código. Verifique que o endpoint SQL está activo e que o Warehouse tem poder computacional suficiente — por exemplo, para 1M de linhas um Warehouse de tamanho médio costuma executar a agregação em dezenas de segundos.

Passo 1: Abrir o Warehouse e iniciar uma sessão T-SQL

Abra o Workspace no Microsoft Fabric, seleccione o seu Warehouse e clique em "New SQL Script" ou "Query" para iniciar uma sessão T-SQL. O objectivo é executar o código para criar o Stored Procedure no contexto do Warehouse. Confirme o contexto de base de dados/schema no topo do editor (por exemplo, dbo) e, se necessário, execute um USE <DatabaseName> antes da criação para garantir que o procedimento fica no esquema correcto.

Passo 2: Planear a lógica do Stored Procedure

Decida o que o Stored Procedure vai fazer. Exemplo prático: uma rotina que agrega vendas por dia e insere os resultados numa tabela de resumo. Pense em parâmetros (p.ex. @StartDate e @EndDate), cardinalidade esperada (uma linha por dia: 7 linhas para uma semana, 30 para um mês) e requisitos de idempotência (executar várias vezes não deve criar duplicados). Identifique colunas-chave para indexação — no caso das vendas, um índice em OrderDate ou uma partição por data pode melhorar muito a performance em conjuntos de dados com milhões de linhas.

Passo 3: Criar a tabela de resumo (se necessário)

Se ainda não existir, crie uma tabela destino no mesmo esquema do Warehouse para armazenar o resumo diário. Para volumes moderados, um esquema simples como o abaixo é suficiente; para volumes mais altos considere compressão, índices ou partições por mês/ano.

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
);

Dica: se espera actualizar frequentemente, crie um índice em SalesDate para acelerar MERGE/UPDATEs. Em testes, uma tabela de resumo com 10k linhas actualiza em milissegundos, enquanto uma origem com 1M de linhas pode demorar 10-60 segundos dependendo do Warehouse.

Passo 4: Escrever o Stored Procedure

Crie o Stored Procedure com parâmetros para a janela de data. Use transacções e tratamento simples de erros para garantir consistência. O exemplo usa MERGE para inserir/actualizar em bloco; isto evita round-trips e é eficiente quando o número de dias no intervalo é pequeno comparado com as linhas de origem.

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

    -- Calcular resumo e inserir/actualizar na tabela de 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 deixar transacções abertas. O THROW com código 51000 indica erro personalizado; em produção registe o erro em tabelas de auditoria ou logs do Warehouse.

Passo 5: Conceder permissões (opcional)

Se outros utilizadores ou serviços precisarem de executar o Stored Procedure, conceda EXECUTE ao papel ou utilizador apropriado. Para automatizações via service principal, conceda ao utilizador associado ao serviço.

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

Princípio do menor privilégio: dê apenas EXECUTE se a conta não precisar de direitos adicionais. Em ambientes com segurança mais apertada, prefira roles com permissão controlada.

Passo 6: Executar e testar o Stored Procedure

Chame o Stored Procedure com um intervalo de datas de teste. Verifique se a lógica insere/actualiza correctamente os registos. Teste primeiro com um intervalo curto (p.ex. 7 dias) e confirme os timings. Se a origem tiver 100k linhas e o Warehouse estiver dimensionado para cargas médias, espere tempos entre 5-30 segundos para agregação.

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;

Validações úteis: comparar SUM(TotalOrders) com SELECT COUNT(*) FROM dbo.Sales WHERE OrderDate BETWEEN ... para garantir integridade.

Verificar o resultado

Confirme que a tabela dbo.Sales_DailySummary contém linhas para cada dia do intervalo e que os valores de TotalAmount e TotalOrders correspondem às agregações da tabela dbo.Sales. Verifique também a coluna LastUpdated para garantir que a execução foi recente. Se não houver resultados, reveja a condição WHERE (atenção a timezones e partes de tempo em OrderDate) e o formato de datas; experimente CAST/CONVERT se necessário. Se notar discrepâncias, execute SELECTs intermédios para validar a agregação e conte nulos ou linhas com datas inválidas.

Conclusão

Agora tem um Stored Procedure no Warehouse do Microsoft Fabric que agrega vendas por dia e mantém uma tabela de resumo. Próximos passos: agendar a execução usando um Pipeline no próprio Workspace ou automatizar com Azure Logic Apps/Power Automate para actualizações periódicas (p.ex. diária às 01:00). Monitorize tempos de execução e use índices em OrderDate se os tempos crescerem. Em ambientes de produção, teste com amostras e monitorize métricas (CPU, tempo, I/O) — uma execução diária típica para 1M de linhas pode demorar entre 20-60 segundos dependendo da configuração do Warehouse.