Podrías usar algo como esto:
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)
Si Param es 0, la primera condición se convierte en 0=0
y coincide con todas las filas, por lo que se devuelven todas las filas. Si param es 1 o 2, solo el respectivo o rama coincide con la primera condición, por lo que devuelve lo que especifica la segunda condición.
Además, la opción option (recompile)
es realmente importante (ver el artículo en el comentario de Martin). Le indica al servidor SQL que use los valores de tiempo de ejecución de los parámetros al preparar un plan de ejecución, así que básicamente:
- cuando @Param =0 la consulta se convierte en
select * from @Accessories
- cuando @Param =1 la consulta se convierte en
select * from @Accessories where atype = 'HDD'
- cuando @Param =2 la consulta se convierte en
select * from @Accessories where atype != 'HDD'