sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo ignorar un parámetro en un procedimiento almacenado si su valor es nulo

Hay un artículo muy bueno Condiciones de búsqueda dinámica en T‑SQL de Erland Sommarskog. Explica varios enfoques que podrían usarse y compara la creación de SQL dinámico como sugirió @lad2025 y el uso de OPTION(RECOMPILE) .

Yo personalmente uso OPTION(RECOMPILE) en estas consultas. Utiliza SQL Server 2008, por lo que esta opción es una buena elección. Si utiliza la ruta de SQL dinámico, asegúrese de leer su otro artículo The Curse and Blessings of Dynamic SQL .

Entonces, su procedimiento se convierte en algo como esto:

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

Por cierto, no está claro lo que está tratando de lograr al verificar el count() , pero quizás todo lo que necesites sea simple TOP(10) para volver como máximo 10 primeras filas. Asegúrate de agregar ORDER BY cláusula si usa TOP para devolver resultados consistentemente. Si no lo sabía, puede tener otro parámetro de su procedimiento para indicar el número máximo de filas para devolver y usarlo en TOP(@ParamMaxRowCount) . No es común tener un procedimiento almacenado que a veces devuelve un conjunto de resultados y otras veces solo imprime un mensaje.