Si realmente debes usar SQL dinámico, usa el store SP_EXECUTESQL. Te permitirá definir variables de tipo OUTPUT.
Sin embargo, por el código que expones, te estás complicando demasiado la existencia. Tu consulta no amerita el uso de sql dinámico en manera alguna. Sólo tienes una variable para afectar el resultado, y ésta no define ningún path de ejecución distinto. Esto debería funcionar:
Código:
CREATE PROCEDURE USP_INV_MOVIMIENTOSALINICIAL
(
@pCodigo as varchar(25),
@psalcant numeric(16,10) output,
@pscostsl numeric(16,10) output,
@pscostus numeric(16,10) output
)
AS
BEGIN
SET NOCOUNT ON;
SELECT TOP 1
@psalcant = A.CAMPO019,
@pscostsl = A.CAMPO034,
@pscostus = A.CAMPO035
FROM TAB011 A
LEFT JOIN TAB006 B
ON A.campo014 = B.Campo001
WHERE A.CAMPO014 = @pCodigo
AND A.CAMPO003 < '20070101'
ORDER BY a.campo003 desc,
a.campo016 desc,
a.campo001 desc,
a.campo002 desc,
a.campo050 desc
END