Когда вы говорите, что он работает нормально в SSMS напрямую, вы имеете в виду, что выполнение самой хранимой процедуры выполняется нормально, или что базовый SQL работает нормально?
Из вашего описания это звучит как пример сниффинга параметров. По сути, SQL Server кэшировал план выполнения, который является оптимальным для одного набора параметров, но исключительно плохим для большинства других.
Вы можете использовать опцию RECOMPILE для запроса в вашей хранимой процедуре, чтобы принудительно перекомпилировать при каждом выполнении. Если это не вызывается часто или компиляция не занимает много времени, вы можете использовать этот трюк .
Другое решение - скопировать параметры хранимой процедуры в локальные переменные и использовать их в запросе. Пример:
CREATE PROCEDURE my_proc
@var1 INT
AS
DECLARE @_var1 AS INT;
SET @_var1 = @var1;
SELECT col1, col2, col3
FROM t1
WHERE t1.pk = @_var1;