No entiendo tu pregunta , cuando especificas un procedimiento almacenado puedes y debes especificar el tamaño el parametros como varchar o int perfectamente.
El no especificar tamaño o no usar un procedimiento almacenado puede provocar errores de seguridad como SQL Injection o buffer Overrun usando el espacio sobrante en el parametro para ejecutar una sentencia SQL adicional aprovechando el contexto de seguridad del procedimiento almacenado.
Ejemplo:
Create procedure miProc
@variable varchar(5)
AS
Select * fom tabla where campo = ' @variable '
GO
Donde esperamos que alguien nos diga
EXEC miProc "ALFI"
Si no limitamos el tamaño a 5 y pusiesemos por ejemplo varchar de 255 algún malintencionado podría hacer algo como esto
EXEC miproc "ALFI ' ; use master ; delete * from master --"
Dejo a tu razonamiento entender que procesaría esta sentencia en el motor de la base de datos recordando que ; significa [ENTER]+GO y -- ignorar el resto de la linea.