Чем хранимая процедура отличается от функции в SQL?

Ответ

Хранимые процедуры и функции — это разные программные объекты в SQL, хотя оба хранятся в БД. Их ключевое отличие — в цели использования и способе вызова.

Критерий Хранимая процедура (Stored Procedure) Функция (User-Defined Function, UDF)
Основная цель Выполнить серию действий (логику). Вычислить и вернуть одно значение (скаляр) или таблицу.
Возвращаемое значение Может не возвращать ничего, возвращать несколько результирующих наборов (SELECT) или выходные параметры. Обязана вернуть одно значение (скалярная функция) или таблицу (табличная функция).
Вызов в SQL Специальной инструкцией (CALL ProcName() или EXEC ProcName). Используется внутри SQL-выражения, как встроенная функция: SELECT dbo.CalcTax(price).
Использование в запросах Нельзя использовать прямо в SELECT или WHERE. Прямо используется в SELECT, WHERE, JOIN и т.д.
DML-операции Может выполнять INSERT, UPDATE, DELETE (в большинстве СУБД). Обычно не может модифицировать данные (ограничение в чисто вычислительных функциях).
Транзакции Может управлять транзакциями (BEGIN TRANSACTION, COMMIT). Обычно не управляет транзакциями.

Пример сравнения в T-SQL (MS SQL Server):

-- 1. ХРАНИМАЯ ПРОЦЕДУРА: выполняет действие и возвращает набор данных.
CREATE PROCEDURE GetTopCustomers
AS
BEGIN
    SELECT TOP 10 customer_id, SUM(total) as total_spent 
    FROM orders 
    GROUP BY customer_id 
    ORDER BY total_spent DESC;
END;
-- Вызов:
EXEC GetTopCustomers;

-- 2. ФУНКЦИЯ: вычисляет и возвращает значение для использования в запросе.
CREATE FUNCTION CalculateDiscount(@price DECIMAL(10,2), @rate INT) 
RETURNS DECIMAL(10,2)
AS
BEGIN
    RETURN @price * @rate / 100.0;
END;
-- Использование в выражении:
SELECT product_name, price, 
       dbo.CalculateDiscount(price, 15) as discount_amount -- Вызов функции
FROM products;

Вывод: Используйте процедуру для выполнения логики и действий. Используйте функцию, когда вам нужно результат вычисления подставить в другое SQL-выражение.

Ответ 18+ 🔞

А, ну вот, опять про эти ваши хранимые штуки! Сидишь такой, пишешь запрос, а тут бац — и надо какую-то логику в БД засунуть. И тут начинается: процедура или функция? А разница, между прочим, пиздец какая принципиальная, хоть и хранятся оба в базе, как два брата-алкаша на чердаке.

Смотри сюда, распишу тебе на пальцах, а то голова уже бздит от этих терминов.

Критерий Хранимая процедура (Stored Procedure) Функция (User-Defined Function, UDF)
Зачем нужна? Сделать кучу дел, навести порядок, выполнить логику. Посчитать и выдать один ответ — число или целую табличку.
Что возвращает? Может и нихуя не вернуть, а может накидать кучу результатов или выходных параметров. Обязана вернуть что-то одно! Либо скаляр, либо таблицу — иначе пиши пропало.
Как позвать? Особым криком: CALL ProcName() или EXEC ProcName. Встраивается прямо в выражение, как родная: SELECT dbo.CalcTax(price).
Где юзать? Не суй её в SELECT или WHERE — обосрёшься. Прямо в SELECT, WHERE, JOIN — везде, где душа пожелает.
Может ли данные менять? Да запросто! INSERT, UPDATE, DELETE — впердолить может всё. Обычно не может, сука! Сиди и считай, не рыпайся.
Транзакции? Может рулить транзакциями: начать, закоммитить, откатить. Обычно нет, сидит тихо и не выёбывается.

Ну и примеры, чтобы совсем понятно стало, на T-SQL:

-- 1. ПРОЦЕДУРА: делает дело и может накидать данных.
CREATE PROCEDURE GetTopCustomers
AS
BEGIN
    SELECT TOP 10 customer_id, SUM(total) as total_spent 
    FROM orders 
    GROUP BY customer_id 
    ORDER BY total_spent DESC;
END;
-- Зовём её отдельно:
EXEC GetTopCustomers;

-- 2. ФУНКЦИЯ: тупо вычисляет значение, чтобы в запросе использовать.
CREATE FUNCTION CalculateDiscount(@price DECIMAL(10,2), @rate INT) 
RETURNS DECIMAL(10,2)
AS
BEGIN
    RETURN @price * @rate / 100.0;
END;
-- А вот она уже внутри всего:
SELECT product_name, price, 
       dbo.CalculateDiscount(price, 15) as discount_amount -- Встроили и красота!
FROM products;

Короче, вывод простой, как три копейки: Процедура — это когда надо делать. Функция — это когда надо посчитать и подставить. Не перепутай, а то будет тебе ебаный стыд вместо результата.