Możesz użyć czegoś takiego:
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)
Jeśli Param ma wartość 0, pierwszy warunek to 0=0
i pasuje do wszystkich wierszy, więc zwracane są wszystkie wiersze. Jeśli param wynosi 1 lub 2, tylko odpowiedni lub rozgałęzienie pasuje do pierwszego warunku, więc zwraca to, co określa drugi warunek.
Również option (recompile)
jest naprawdę ważny (zobacz artykuł w komentarzu Martina). Instruuje serwer SQL, aby używał wartości parametrów wykonawczych podczas przygotowywania planu wykonania, więc w skrócie:
- kiedy @Param =0 zapytanie staje się
select * from @Accessories
- kiedy @Param =1 zapytanie staje się
select * from @Accessories where atype = 'HDD'
- kiedy @Param =2 zapytanie staje się
select * from @Accessories where atype != 'HDD'