Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So ignorieren Sie einen Parameter in einer gespeicherten Prozedur, wenn sein Wert null ist

Es gibt einen sehr guten Artikel Dynamische Suchbedingungen in T‑SQL von Erland Sommarskog. Er erklärt mehrere Ansätze, die verwendet werden könnten, und vergleicht den Aufbau von dynamischem SQL, wie von @lad2025 vorgeschlagen, mit der Verwendung von OPTION(RECOMPILE) .

Ich persönlich verwende OPTION(RECOMPILE) bei diesen Abfragen. Sie verwenden SQL Server 2008, daher ist diese Option eine gute Wahl. Wenn Sie über die dynamische SQL-Route gehen, lesen Sie unbedingt seinen anderen Artikel The Curse and Blessings of Dynamic SQL .

Ihre Prozedur sieht also ungefähr so ​​aus:

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

Übrigens ist nicht klar, was Sie mit der Überprüfung von count() erreichen wollen , aber vielleicht brauchen Sie nur einfach TOP(10) um höchstens 10 erste Zeilen zurückzugeben. Achten Sie darauf, ORDER BY hinzuzufügen -Klausel, wenn Sie TOP verwenden um Ergebnisse konsistent zurückzugeben. Wenn Sie es nicht wussten, können Sie einen anderen Parameter Ihrer Prozedur haben, um die maximale Anzahl der zurückzugebenden Zeilen anzugeben, und ihn in TOP(@ParamMaxRowCount) verwenden . Es ist nicht üblich, eine gespeicherte Prozedur zu haben, die manchmal eine Ergebnismenge zurückgibt und manchmal nur eine Nachricht ausgibt.