Como criar uma stored procedure com parametros no SQL Server
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
SELECTeWHERE.
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?