Existe um artigo muito bom Condições de pesquisa dinâmica em T‑SQL por Erland Sommarskog. Ele explica várias abordagens que podem ser usadas e compara a construção de SQL dinâmico como @lad2025 sugerido e usando
OPTION(RECOMPILE)
. Eu pessoalmente uso
OPTION(RECOMPILE)
nestas consultas. Você usa o SQL Server 2008, portanto, essa opção é uma boa escolha. Se você for pela rota SQL dinâmica, certifique-se de ler seu outro artigo The Curse and Blessings of Dynamic SQL
. Então, seu procedimento se torna algo assim:
create procedure proc1
@var1 varchar(100) = null,
@var2 varchar(100) = null,
@var3 varchar(100) = null,
@var4 varchar(100) = null,
........
@var10 varchar(100) = null
as
begin
insert into #a
select * from
(
select *
from
tab1 as a
inner join tab2 as b on a.rollnumber = b.rollnumber
inner join tab3 as c on c.city = b.city
........
inner join tab10 as j on J.id = i.id
where
(a.id = @var1 OR @var1 IS NULL)
and (b.id = @var2 OR @var2 IS NULL)
and (c.id = @var3 OR @var3 IS NULL)
...........
and (J.id = @var10 OR @var10 IS NULL)
) as abc
OPTION(RECOMPILE);
if (select count(*) from #a) < 10
begin
select * from #a
end
else
begin
print 'Cannot display the records as count is more than 10'
end
end
A propósito, não está claro o que você está tentando alcançar verificando o
count()
, mas talvez tudo o que você precisa seja simples TOP(10)
para retornar no máximo 10 primeiras linhas. Certifique-se de adicionar ORDER BY
cláusula se você usar TOP
para retornar resultados de forma consistente. Se você não sabia, você pode ter outro parâmetro do seu procedimento para indicar o número máximo de linhas a serem retornadas e usá-lo em TOP(@ParamMaxRowCount)
. Não é comum ter um procedimento armazenado que às vezes retorna o conjunto de resultados e às vezes apenas imprime uma mensagem.