sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man ignorerar en parameter i lagrad procedur om dess värde är null

Det finns en mycket bra artikel Dynamiska sökvillkor i T‑SQL av Erland Sommarskog. Han förklarar flera tillvägagångssätt som kan användas och jämför att bygga dynamisk SQL som @lad2025 föreslog och använda OPTION(RECOMPILE) .

Jag använder personligen OPTION(RECOMPILE) i dessa frågor. Du använder SQL Server 2008, så det här alternativet är ett bra val. Om du går via den dynamiska SQL-vägen, se till att läsa hans annan artikel The Curse and Blessings of Dynamic SQL .

Så din procedur blir ungefär så här:

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

Förresten, det är inte klart vad du försöker uppnå genom att kontrollera count() , men kanske allt du behöver är enkel TOP(10) för att returnera högst 10 första rader. Se till att lägga till ORDER BY om du använder TOP att ge resultat konsekvent. Om du inte visste det kan du ha en annan parameter i din procedur för att indikera det maximala antalet rader att returnera och använda den i TOP(@ParamMaxRowCount) . Det är inte vanligt att ha en lagrad procedur som ibland returnerar resultatuppsättning och ibland bara skriver ut ett meddelande.



  1. Uppdaterar serialiserad array i mysql (utan att avserialisera?)

  2. SqlDeveloper:rensa nätverksaliaslista

  3. Subquerys rand()-kolumn omvärderas för varje upprepat val i MySQL 5.7/8.0 vs MySQL 5.6

  4. Infoga data från SQL Server till MySql med Trigger