Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да игнорирате параметър в съхранена процедура, ако стойността му е нула

Има една много добра статия Условия за динамично търсене в T‑SQL от Erland Sommarskog. Той обяснява няколко подхода, които могат да се използват, и сравнява изграждането на динамичен SQL, както е предложено от @lad2025, и използването на OPTION(RECOMPILE) .

Аз лично използвам OPTION(RECOMPILE) в тези заявки. Вие използвате SQL Server 2008, така че тази опция е добър избор. Ако все пак преминете през маршрута на динамичния SQL, не забравяйте да прочетете неговата друга статия Проклятието и благословиите на Dynamic SQL .

И така, вашата процедура става нещо подобно:

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

Между другото, не е ясно какво се опитвате да постигнете, като проверявате count() , но може би всичко, от което се нуждаете, е просто TOP(10) да върне най-много 10 първи реда. Уверете се, че сте добавили ORDER BY клауза, ако използвате TOP за връщане на резултати последователно. Ако не сте знаели, можете да имате друг параметър на вашата процедура, за да посочите максималния брой редове за връщане и да го използвате в TOP(@ParamMaxRowCount) . Не е обичайно да има съхранена процедура, която понякога връща набор от резултати, а понякога само отпечатва съобщение.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Възникна грешка, свързана с мрежата или специфична за екземпляр, при установяване на връзка със SQL Server

  2. SQL Server BCP експортира повреден файл?

  3. SQL Server Log Shipping &Disaster Recovery Installation and Configuration -2

  4. Трябва ли да задам максимален размер на пула в низа за връзка с базата данни? Какво ще стане, ако не го направя?

  5. Проблем с номер на ред за съхранена процедура на SQL Server