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.