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

Como criar uma stored procedure com parametros no SQL Server

Joao Barros 06 de July de 2026 5 min de leitura

Uma stored procedure e um bloco de T-SQL guardado na base de dados que podes executar sempre que precisares, e os parametros tornam-na flexivel: passas valores diferentes e obtens resultados diferentes sem reescrever a consulta. Saber como criar uma stored procedure com parametros no SQL Server ajuda-te a centralizar logica, reduzir repeticao e proteger as tuas consultas contra SQL injection. Alem disso, o SQL Server guarda o plano de execucao da procedure, o que pode melhorar o desempenho quando a executas muitas vezes.

Pre-requisitos

  • Uma instancia de SQL Server (serve o SQL Server Express, que e gratuito).
  • SQL Server Management Studio (SSMS) ou Azure Data Studio para correr as consultas.
  • Uma base de dados onde possas criar objetos e a permissao CREATE PROCEDURE.
  • Conhecer o basico de SELECT e WHERE.

Passo 1: Criar uma tabela de exemplo

Para testar, vamos precisar de dados. Cria uma tabela simples de vendas e insere algumas linhas. Os valores sao ficticios e servem apenas para veres a procedure a devolver resultados. Corre este codigo na tua base de dados de teste:

CREATE TABLE dbo.Vendas (
    VendaID     INT IDENTITY(1,1) PRIMARY KEY,
    Cliente     NVARCHAR(100),
    Pais        NVARCHAR(50),
    Valor       DECIMAL(10,2),
    DataVenda   DATE
);

INSERT INTO dbo.Vendas (Cliente, Pais, Valor, DataVenda) VALUES
('Ana Silva',    'Portugal', 120.50, '2026-01-15'),
('Joao Costa',   'Portugal', 340.00, '2026-02-03'),
('Marta Ruiz',   'Espanha',   85.90, '2026-02-20'),
('Pedro Alves',  'Portugal', 210.00, '2026-03-11');

Passo 2: Criar a stored procedure com um parametro

Agora cria a procedure. O parametro de entrada comeca com @ e tem um tipo de dados, tal como uma coluna. Esta procedure devolve as vendas de um pais a tua escolha:

CREATE PROCEDURE dbo.ObterVendasPorPais
    @Pais NVARCHAR(50)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT Cliente, Valor, DataVenda
    FROM dbo.Vendas
    WHERE Pais = @Pais
    ORDER BY DataVenda;
END;

O SET NOCOUNT ON evita mensagens desnecessarias de "linhas afetadas" e torna a procedure ligeiramente mais rapida. O @Pais funciona como uma variavel dentro da procedure. Da ao parametro o mesmo tipo de dados da coluna que vais comparar (aqui, NVARCHAR(50)); tipos incompativeis obrigam o SQL Server a conversoes que podem abrandar a consulta.

Passo 3: Executar a stored procedure

Para correr a procedure usas EXEC seguido do valor do parametro. Podes passar o valor de forma posicional ou, melhor ainda, com o nome do parametro (mais legivel):

-- Forma posicional
EXEC dbo.ObterVendasPorPais 'Portugal';

-- Forma nomeada (recomendada)
EXEC dbo.ObterVendasPorPais @Pais = 'Espanha';

Cada chamada devolve apenas as linhas do pais indicado. Mudaste o resultado sem tocar na consulta: e esse o poder dos parametros.

Dica de seguranca: passar valores como parametros, em vez de os concatenar diretamente no texto da consulta, e a forma correta de evitar SQL injection. A procedure trata o valor sempre como dado, nunca como codigo.

Passo 4: Varios parametros e um valor por omissao

Podes ter quantos parametros quiseres. Um parametro com valor por omissao (default) torna-se opcional: se nao o passares, usa o valor definido. Aqui adicionamos um valor minimo que, por omissao, e 0. Usa CREATE OR ALTER para atualizar a procedure sem a apagar primeiro:

CREATE OR ALTER PROCEDURE dbo.ObterVendasPorPais
    @Pais        NVARCHAR(50),
    @ValorMinimo DECIMAL(10,2) = 0
AS
BEGIN
    SET NOCOUNT ON;

    SELECT Cliente, Valor, DataVenda
    FROM dbo.Vendas
    WHERE Pais = @Pais
      AND Valor >= @ValorMinimo
    ORDER BY Valor DESC;
END;

Agora tens duas formas de chamar a procedure:

-- Usa o valor por omissao (@ValorMinimo = 0)
EXEC dbo.ObterVendasPorPais @Pais = 'Portugal';

-- Passa os dois parametros
EXEC dbo.ObterVendasPorPais @Pais = 'Portugal', @ValorMinimo = 200;

Passo 5: Devolver um valor com um parametro OUTPUT

As vezes queres devolver um unico valor, como um total ou uma contagem, em vez de uma tabela. Para isso usa um parametro OUTPUT: o valor que lhe atribuis dentro da procedure fica disponivel para quem a chamou.

CREATE OR ALTER PROCEDURE dbo.ContarVendasPorPais
    @Pais    NVARCHAR(50),
    @Total   INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT @Total = COUNT(*)
    FROM dbo.Vendas
    WHERE Pais = @Pais;
END;

Para o executar, declara uma variavel que vai receber o resultado e marca-a tambem com OUTPUT na chamada:

DECLARE @n INT;
EXEC dbo.ContarVendasPorPais @Pais = 'Portugal', @Total = @n OUTPUT;
PRINT 'Vendas em Portugal: ' + CAST(@n AS NVARCHAR(10));

Verificar o resultado

Confirma que a procedure existe consultando a vista de sistema sys.procedures:

SELECT name, create_date, modify_date
FROM sys.procedures
WHERE name IN ('ObterVendasPorPais', 'ContarVendasPorPais');

No SSMS, tambem a ves em Object Explorer, dentro da base de dados, em Programmability > Stored Procedures. Se ao executar EXEC dbo.ObterVendasPorPais @Pais = 'Portugal' obtens as linhas esperadas, esta tudo a funcionar.

Conclusao

Ja sabes criar uma stored procedure com um ou varios parametros, definir valores por omissao e devolver resultados com um parametro OUTPUT. Como a logica fica guardada num so sitio, podes reutiliza-la a partir de aplicacoes, relatorios ou outras procedures sem copiar codigo. O proximo passo natural e tornar a procedure mais robusta com tratamento de erros usando TRY...CATCH e transacoes, para garantir que as operacoes de escrita ficam consistentes. Que parametro vais acrescentar primeiro a tua proxima procedure: uma data de inicio ou um limite de valor?