Если вы можете превратить хранимую процедуру в функцию, которая возвращает таблицу, вы можете использовать перекрестное применение.
Например, если у вас есть таблица клиентов, и вы хотите вычислить сумму их заказов, вы бы создали функцию, которая бы принимала идентификатор клиента и возвращала сумму.
И вы могли бы сделать это:
SELECT CustomerID, CustomerSum.Total
FROM Customers
CROSS APPLY ufn_ComputeCustomerTotal(Customers.CustomerID) AS CustomerSum
Где будет выглядеть функция:
CREATE FUNCTION ComputeCustomerTotal
(
@CustomerID INT
)
RETURNS TABLE
AS
RETURN
(
SELECT SUM(CustomerOrder.Amount) AS Total FROM CustomerOrder WHERE CustomerID = @CustomerID
)
Очевидно, что приведенный выше пример может быть выполнен без определяемой пользователем функции в одном запросе.
Недостатком является то, что функции очень ограничены - многие функции хранимой процедуры недоступны в пользовательской функции, и преобразование хранимой процедуры в функцию не всегда работает.