Er is een zeer goed artikel Dynamische zoekvoorwaarden in T‑SQL
door Erland Sommarskog. Hij legt verschillende benaderingen uit die kunnen worden gebruikt en vergelijkt het bouwen van dynamische SQL zoals @lad2025 suggereerde en het gebruik van OPTION(RECOMPILE)
.
Ik gebruik persoonlijk OPTION(RECOMPILE)
in deze vragen. U gebruikt SQL Server 2008, dus deze optie is een goede keuze. Als je via de dynamische SQL-route gaat, lees dan zeker zijn andere artikel The Curse and Blessings of Dynamic SQL
.
Dus je procedure wordt ongeveer als volgt:
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
Het is trouwens niet duidelijk wat je probeert te bereiken door de count()
. aan te vinken , maar misschien is alles wat je nodig hebt eenvoudig TOP(10)
om maximaal 10 eerste rijen terug te geven. Zorg ervoor dat u ORDER BY
. toevoegt clausule als u TOP
. gebruikt resultaten consistent te retourneren. Als u het niet wist, kunt u een andere parameter van uw procedure gebruiken om het maximale aantal rijen aan te geven dat moet worden geretourneerd en deze gebruiken in TOP(@ParamMaxRowCount)
. Het is niet gebruikelijk om een opgeslagen procedure te hebben die soms een resultaatset retourneert en soms alleen een bericht afdrukt.