Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zignorować parametr w procedurze składowanej, jeśli jego wartość to null?

Istnieje bardzo dobry artykuł Dynamiczne warunki wyszukiwania w T-SQL autorstwa Erlanda Sommarskoga. Wyjaśnia kilka podejść, które można zastosować i porównuje budowanie dynamicznego SQL zgodnie z sugestiami @lad2025 i przy użyciu OPTION(RECOMPILE) .

Osobiście używam OPTION(RECOMPILE) w tych zapytaniach. Używasz SQL Server 2008, więc ta opcja jest dobrym wyborem. Jeśli korzystasz z dynamicznej trasy SQL, koniecznie przeczytaj jego kolejny artykuł Klątwa i błogosławieństwa dynamiki SQL .

Twoja procedura wygląda więc mniej więcej tak:

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

Nawiasem mówiąc, nie jest jasne, co chcesz osiągnąć, sprawdzając count() , ale może wystarczy proste TOP(10) zwrócić co najwyżej 10 pierwszych wierszy. Pamiętaj, aby dodać ORDER BY klauzula, jeśli używasz TOP konsekwentnie zwracać wyniki. Jeśli nie wiesz, możesz mieć inny parametr procedury, aby wskazać maksymalną liczbę wierszy do zwrócenia i użyć go w TOP(@ParamMaxRowCount) . Nie jest powszechnym posiadanie procedury składowanej, która czasami zwraca zestaw wyników, a czasami tylko wyświetla komunikat.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak niejawne transakcje działają w SQL Server

  2. Powody, dla których nie ma indeksu klastrowego w SQL Server 2005

  3. Używanie tabeli bazy danych jako kolejki

  4. Traktuj kolumnę jako inny typ do sortowania

  5. Zapytanie o relację rodzic-dziecko do najwyższego poziomu