sql >> Database >  >> RDS >> Sqlserver

Hoe een parameter in de opgeslagen procedure te negeren als de waarde nul is

Er is een zeer goed artikel Dynamische zoekvoorwaarden in T‑SQL door Erland Sommarskog. Hij legt verschillende benaderingen uit die kunnen worden gebruikt en vergelijkt het bouwen van dynamische SQL zoals @lad2025 suggereerde en het gebruik van OPTION(RECOMPILE) .

Ik gebruik persoonlijk OPTION(RECOMPILE) in deze vragen. U gebruikt SQL Server 2008, dus deze optie is een goede keuze. Als je via de dynamische SQL-route gaat, lees dan zeker zijn andere artikel The Curse and Blessings of Dynamic SQL .

Dus je procedure wordt ongeveer als volgt:

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

Het is trouwens niet duidelijk wat je probeert te bereiken door de count() . aan te vinken , maar misschien is alles wat je nodig hebt eenvoudig TOP(10) om maximaal 10 eerste rijen terug te geven. Zorg ervoor dat u ORDER BY . toevoegt clausule als u TOP . gebruikt resultaten consistent te retourneren. Als u het niet wist, kunt u een andere parameter van uw procedure gebruiken om het maximale aantal rijen aan te geven dat moet worden geretourneerd en deze gebruiken in TOP(@ParamMaxRowCount) . Het is niet gebruikelijk om een ​​opgeslagen procedure te hebben die soms een resultaatset retourneert en soms alleen een bericht afdrukt.



  1. Hoe maak je een back-up van een postgresql-database vanuit psql?

  2. Verbinden door in Oracle SQL

  3. RDS naar S3 met pg_dump direct (zonder tussenpersoon)

  4. MySQL LOAD DATA INFILE gebruiken met niet-afdrukbare tekenscheidingstekens