Você poderia usar algo assim:
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)
Se Param for 0, a primeira condição se tornará
0=0
e corresponde a todas as linhas, para que todas as linhas sejam retornadas. Se param for 1 ou 2, somente o respectivo ou branch corresponde na primeira condição, então ele retorna o que a segunda condição especifica. Além disso, a opção
option (recompile)
é realmente importante (veja o artigo no comentário de Martin). Ele instrui o SQL Server a usar os valores de tempo de execução dos parâmetros ao preparar um plano de execução, basicamente:- quando @Param =0 a consulta se torna
select * from @Accessories
- quando @Param =1 a consulta se torna
select * from @Accessories where atype = 'HDD'
- quando @Param =2 a consulta se torna
select * from @Accessories where atype != 'HDD'