Нет хороших способов сделать это. Это ограничение хранимых процедур. Ваши варианты:
Переключите процедуру на Пользовательскую функцию . Сегодня во всем мире люди делают хранимые процедуры, которые должны быть функциями. Это проблема образования. Ваша ситуация является хорошим примером, почему. Если бы ваша процедура была вместо этого UDF, вы могли бы просто сделать следующее, именно так, как вы интуитивно думаете, вы должны быть в состоянии:
SELECT * FROM udf_who2()
WHERE login='bmccormack'
Если вы действительно не можете коснуться своей процедуры, и должен сделать это в sql, то вам придется повеселиться. Сделайте другую хранимую процедуру, чтобы обернуть вашу оригинальную процедуру. Внутри вашей новой процедуры вызовите существующую процедуру и поместите значения во временную таблицу, затем выполните запрос к этой таблице с нужным фильтром и верните этот результат во внешний мир.
Начиная с SQL Server 2005, пользовательские функции - это способ инкапсуляции извлечения данных. Хранимые процедуры, наряду с представлениями, являются специальными инструментами для использования в определенных ситуациях. Они оба очень удобны в нужное время, но не лучший выбор. Некоторые могут подумать, что вышеприведенный пример (A) получает все результаты функции, а затем (B) фильтрует этот набор результатов, как подзапрос. Это не тот случай . SQL Server 2005+ оптимизирует этот запрос; если на login
есть индекс, вы не увидите сканирование таблицы в плане выполнения запроса; очень эффективно.
Редактировать : Я должен добавить, что внутренности UDF похожи на внутреннюю часть SP. Если вам не хватает логики SP, которую вы хотите избежать, вы все равно можете изменить ее на функцию. Несколько раз я брал большой, страшный код процедур, который мне не хотелось понимать, и успешно переносил его в функцию. Единственная проблема будет в том случае, если процедура изменяет что-либо помимо возврата результатов; UDF не могут изменять данные в БД.