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

Sådan ignoreres en parameter i den lagrede procedure, hvis dens værdi er null

Der er en meget god artikel Dynamiske søgebetingelser i T‑SQL af Erland Sommarskog. Han forklarer flere tilgange, der kunne bruges, og sammenligner opbygning af dynamisk SQL, som @lad2025 foreslog, og brug af OPTION(RECOMPILE) .

Jeg bruger personligt OPTION(RECOMPILE) i disse forespørgsler. Du bruger SQL Server 2008, så denne mulighed er et godt valg. Hvis du går via den dynamiske SQL-rute, så sørg for at læse hans anden artikel The Curse and Blessings of Dynamic SQL .

Så din procedure bliver sådan her:

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

Det er i øvrigt ikke klart, hvad du forsøger at opnå ved at kontrollere count() , men måske alt hvad du behøver er simpel TOP(10) for at returnere højst 10 første rækker. Sørg for at tilføje ORDER BY klausul, hvis du bruger TOP at returnere resultater konsekvent. Hvis du ikke vidste det, kan du få en anden parameter i din procedure til at angive det maksimale antal rækker, der skal returneres og bruge det i TOP(@ParamMaxRowCount) . Det er ikke almindeligt at have en lagret procedure, der nogle gange returnerer resultatsæt og nogle gange kun udskriver en besked.



  1. VÆLG data fra flere tabeller?

  2. Hvordan udfører man en rækkelås?

  3. KONCAT flere felter til et enkelt felt med enkelt afstand

  4. Postgresql-forespørgsel til at få n-niveau overordnet-barn-relation gemt i en enkelt tabel