Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come ignorare un parametro nella stored procedure se il suo valore è null

C'è un ottimo articolo Condizioni di ricerca dinamica in T-SQL di Erland Sommarskog. Spiega diversi approcci che potrebbero essere utilizzati e confronta la creazione di SQL dinamico come suggerito da @lad2025 e l'utilizzo di OPTION(RECOMPILE) .

Personalmente utilizzo OPTION(RECOMPILE) in queste domande. Si utilizza SQL Server 2008, quindi questa opzione è una buona scelta. Se segui il percorso SQL dinamico, assicurati di leggere il suo altro articolo The Curse and Blessings of Dynamic SQL .

Quindi, la tua procedura diventa qualcosa del genere:

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 proposito, non è chiaro cosa stai cercando di ottenere controllando count() , ma forse tutto ciò di cui hai bisogno è un semplice TOP(10) per restituire al massimo 10 prime righe. Assicurati di aggiungere ORDER BY clausola se usi TOP per restituire risultati in modo coerente. Se non lo sapevi, puoi avere un altro parametro della tua procedura per indicare il numero massimo di righe da restituire e usarlo in TOP(@ParamMaxRowCount) . Non è comune avere una procedura memorizzata che a volte restituisce un set di risultati e talvolta stampa solo un messaggio.