Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment ignorer un paramètre dans une procédure stockée si sa valeur est nulle

Il existe un très bon article Conditions de recherche dynamiques dans T‑SQL par Erland Sommarskog. Il explique plusieurs approches qui pourraient être utilisées et compare la construction de SQL dynamique comme suggéré par @lad2025 et l'utilisation de OPTION(RECOMPILE) .

Personnellement, j'utilise OPTION(RECOMPILE) dans ces requêtes. Vous utilisez SQL Server 2008, cette option est donc un bon choix. Si vous passez par la route SQL dynamique, assurez-vous de lire son autre article The Curse and Blessings of Dynamic SQL .

Ainsi, votre procédure devient quelque chose comme ceci :

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

Au fait, ce que vous essayez d'obtenir en vérifiant le count() n'est pas clair , mais peut-être que tout ce dont vous avez besoin est simple TOP(10) pour renvoyer au plus 10 premières lignes. Assurez-vous d'ajouter ORDER BY clause si vous utilisez TOP pour renvoyer les résultats de manière cohérente. Si vous ne le saviez pas, vous pouvez avoir un autre paramètre de votre procédure pour indiquer le nombre maximum de lignes à retourner et l'utiliser dans TOP(@ParamMaxRowCount) . Il n'est pas courant d'avoir une procédure stockée qui renvoie parfois un ensemble de résultats et parfois n'imprime qu'un message.