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