Хранимые процедуры (Stored Procedures) и пользовательские функции (User-Defined Functions, UDF) — это два основных способа инкапсуляции логики в SQL Server, но они имеют ключевые различия:
-- Можно использовать в SELECT
SELECT dbo.CalculateDiscount(OrderTotal) FROM Orders;
-- Только отдельный вызов
EXEC dbo.ProcessOrder @OrderID = 123;
CREATE FUNCTION dbo.GetTax(@amount DECIMAL(18,2))
RETURNS DECIMAL(18,2)
AS BEGIN
RETURN @amount * 0.2 -- Обязан вернуть значение
END
CREATE PROC dbo.UpdateInventory
@ProductID INT,
@QtyChange INT
AS
BEGIN
UPDATE Inventory SET Qty += @QtyChange
WHERE ProductID = @ProductID
-- Может не возвращать ничего
END
CREATE PROC dbo.TransferFunds
@FromAccount INT,
@ToAccount INT,
@Amount DECIMAL(18,2)
AS
BEGIN
BEGIN TRANSACTION;
BEGIN TRY
UPDATE Accounts SET Balance -= @Amount WHERE ID = @FromAccount;
UPDATE Accounts SET Balance += @Amount WHERE ID = @ToAccount;
COMMIT;
END TRY
BEGIN CATCH
ROLLBACK;
THROW;
END CATCH
END
CREATE FUNCTION dbo.GetCustomerOrders(@CustomerID INT)
RETURNS TABLE
AS RETURN (
SELECT * FROM Orders WHERE CustomerID = @CustomerID
)
CREATE FUNCTION dbo.ComplexCalculation()
RETURNS @Result TABLE (ID INT, Value DECIMAL(18,2))
AS
BEGIN
-- Множество операций
RETURN
END
Характеристика | Хранимые процедуры | Пользовательские функции |
---|---|---|
Вызов в SELECT | Нет | Да |
Изменение данных | Да | Ограничено |
Транзакции | Да | Нет |
Возврат таблиц | Через SELECT | Через RETURNS TABLE |
OUTPUT параметры | Да | Нет |
Вложенность вызовов | Да | Да (с ограничениями) |
Использование временных таблиц | Да | Только табличные переменные |
Резюмируем: Хранимые процедуры лучше подходят для операций изменения данных и сложной бизнес-логики, тогда как функции идеальны для вычислений и повторного использования в запросах. Выбор между ними должен основываться на требуемой функциональности и способе интеграции с другими SQL-операциями.