sql >> Databáze >  >> RDS >> Sqlserver

Jak ignorovat parametr v uložené proceduře, pokud je jeho hodnota null

Existuje velmi dobrý článek Podmínky dynamického vyhledávání v T‑SQL od Erlanda Sommarskoga. Vysvětluje několik přístupů, které lze použít, a porovnává vytváření dynamického SQL, jak navrhl @lad2025, a pomocí OPTION(RECOMPILE) .

Osobně používám OPTION(RECOMPILE) v těchto dotazech. Používáte SQL Server 2008, takže tato možnost je dobrou volbou. Pokud se vydáte cestou dynamického SQL, přečtěte si jeho další článek The Curse and Blessings of Dynamic SQL .

Takže váš postup bude něco takového:

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

Mimochodem, není jasné, čeho se snažíte dosáhnout kontrolou count() , ale možná vše, co potřebujete, je jednoduchý TOP(10) vrátit maximálně 10 prvních řádků. Nezapomeňte přidat ORDER BY klauzule, pokud používáte TOP konzistentně vracet výsledky. Pokud jste to nevěděli, můžete použít další parametr vaší procedury, který označí maximální počet řádků, které se mají vrátit, a použít jej v TOP(@ParamMaxRowCount) . Není obvyklé mít uloženou proceduru, která někdy vrátí sadu výsledků a někdy pouze vytiskne zprávu.



  1. MySQL vybírá pole obsahující úvodní nebo koncové mezery

  2. Dynamické provádění dotazů v PL/pgSQL

  3. Jak opravit poškozený pohled SQL

  4. Jak mohu zabránit selhání připojení DB, když je síť nestabilní?