Sie könnten so etwas verwenden:
select *
from @Accessories
where (@Param = 0)
or (@Param = 1 and atype = 'HDD')
--or (@Param = 1 and itype = 1) , if itype and atype are connected
or (@Param = 2 and atype != 'HDD')
option (recompile)
Wenn Param 0 ist, wird die erste Bedingung zu 0=0
und Übereinstimmungen für alle Zeilen, sodass alle Zeilen zurückgegeben werden. Wenn param 1 oder 2 ist, stimmt nur der entsprechende oder-Zweig mit der ersten Bedingung überein, sodass zurückgegeben wird, was die zweite Bedingung angibt.
Auch die option (recompile)
ist wirklich wichtig (siehe Artikel in Martins Kommentar). Es weist SQL Server an, die Laufzeitwerte der Parameter beim Vorbereiten eines Ausführungsplans zu verwenden, also im Grunde:
- Wenn @Param =0 ist, wird die Abfrage zu
select * from @Accessories
- Wenn @Param =1 ist, wird die Abfrage zu
select * from @Accessories where atype = 'HDD'
- Wenn @Param =2 ist, wird die Abfrage zu
select * from @Accessories where atype != 'HDD'