Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como ignorar um parâmetro no procedimento armazenado se seu valor for nulo


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.