Si necesitas parametrizar algo más que los valores de los campos que se introducen en la parte del WHERE en una sentencia T-SQL de un procedimiento almacenado seguramente vas a tener que utilizar SQL dinámico, aunque si se puede hacer lo mismo sin SQL dinámico siempre es mejor, más seguro y más eficiente.
Ejemplo de sentencias que se pueden hacer dentro de un procedure con SQL 'Estático'
INSERT INTO estadisticas(idFecha,fecha,bd,tabla,campo,filtro,funcion,valor)
values (@idfecha,getdate(),@bd,@tabla,@campo,'','COUNT',@valor)
SELECT @valor= valor FROM estadisticas WHERE bd=@bd and tabla=@tabla and campo=@campo
Ejemplos de sentencias que se pueden hacer dentro de un procedure con SQL dinámico
Si es necesario parametrizar el nombre de la tabla de la query, o partes de la sentencia fuera del WHERE, se puede utilizar SQL dinamico con la opción poco recomendada porque el motor no puede optimizar nada, y porque se corre el peligro de sufrir un ataque de SQL Injection de montar la sentencia en un string, y ejecutarlo directamente con EXEC.
Un ejemplo de lo que se puede hacer, pero es mejor evitar: