Como criar um Stored Procedure no Warehouse do Microsoft Fabric
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.