Это ответ на слегка измененную версию вашего вопроса. Если вы можете отказаться от использования хранимой процедуры для пользовательской функции, вы можете использовать встроенную табличную пользовательскую функцию. По сути, это хранимая процедура (будет принимать параметры), которая возвращает таблицу как набор результатов; и, следовательно, будет хорошо с заявлением INTO.
Вот хорошая быстрая статья о ней и других пользовательских функциях. Если у вас все еще есть потребность в хранимой процедуре, вы можете заключить встроенную табличную пользовательскую функцию в хранимую процедуру. Хранимая процедура просто передает параметры, когда она вызывает select * из встроенной пользовательской функции с табличным значением.
Так, например, у вас есть встроенная пользовательская функция с табличным значением для получения списка клиентов для определенного региона:
CREATE FUNCTION CustomersByRegion
(
@RegionID int
)
RETURNS TABLE
AS
RETURN
SELECT *
FROM customers
WHERE RegionID = @RegionID
GO
Затем вы можете вызвать эту функцию, чтобы получить, что ваши результаты такие:
SELECT * FROM CustomersbyRegion(1)
Или сделать ВЫБОР В:
SELECT * INTO CustList FROM CustomersbyRegion(1)
Если вам все еще нужна хранимая процедура, оберните функцию следующим образом:
CREATE PROCEDURE uspCustomersByRegion
(
@regionID int
)
AS
BEGIN
SELECT * FROM CustomersbyRegion(@regionID);
END
GO
Я думаю, что это самый «бесполезный» метод для получения желаемых результатов. Он использует существующие функции, так как они предназначены для использования без дополнительных сложностей. Вложив встроенную пользовательскую функцию с табличным значением в хранимую процедуру, вы получаете доступ к этой функции двумя способами. Плюс! У вас есть только одна точка обслуживания для реального кода SQL.
Было предложено использовать OPENROWSET, но это не то, для чего предназначалась функция OPENROWSET (из Books Online):
Включает всю информацию о подключении
что требуется для доступа к удаленным данным
из источника данных OLE DB. это
метод является альтернативой доступа
таблицы в связанном сервере и является
одноразовый, специальный метод подключения
и доступ к удаленным данным с помощью OLE
DB. Для более частых ссылок на
Источники данных OLE DB, используйте связанные
вместо серверов.
Использование OPENROWSET выполнит работу, но потребует дополнительных затрат для открытия локальных соединений и сортировки данных. Это также может быть не вариант во всех случаях, поскольку требует специального разрешения запроса, которое представляет угрозу безопасности и, следовательно, может быть нежелательным. Кроме того, подход OPENROWSET исключает использование хранимых процедур, возвращающих более одного набора результатов. Этого можно достичь, заключив в одну хранимую процедуру несколько встроенных пользовательских функций табличного значения.