Функция в SQL Server — это именованный объект базы данных, который содержит набор SQL-операторов и возвращает значение. В отличие от хранимых процедур, функции всегда возвращают результат (скалярное значение или таблицу) и могут использоваться в SQL-выражениях.
Обязательное возвращаемое значение
Все функции должны возвращать результат (в отличие от процедур)
Использование в запросах
Функции можно вызывать внутри SELECT, WHERE и других выражений
Ограничения
Не могут модифицировать состояние базы данных (с некоторыми исключениями)
Возвращают одиночное значение определенного типа данных.
CREATE FUNCTION dbo.GetEmployeeAge(@EmployeeID INT)
RETURNS INT
AS
BEGIN
DECLARE @Age INT;
SELECT @Age = DATEDIFF(YEAR, BirthDate, GETDATE())
FROM Employees
WHERE EmployeeID = @EmployeeID;
RETURN @Age;
END;
Использование:
SELECT EmployeeName, dbo.GetEmployeeAge(EmployeeID) AS Age
FROM Employees;
Возвращают таблицу как результат одного SELECT.
CREATE FUNCTION dbo.GetEmployeesByDepartment(@DeptID INT)
RETURNS TABLE
AS
RETURN
(
SELECT EmployeeID, EmployeeName, Position
FROM Employees
WHERE DepartmentID = @DeptID
);
Использование:
SELECT * FROM dbo.GetEmployeesByDepartment(5);
Создают и заполняют возвращаемую таблицу в теле функции.
CREATE FUNCTION dbo.GetEmployeeHierarchy(@ManagerID INT)
RETURNS @Result TABLE (
EmployeeID INT,
EmployeeName NVARCHAR(100),
Level INT
)
AS
BEGIN
WITH EmployeeCTE AS (
SELECT EmployeeID, EmployeeName, 0 AS Level
FROM Employees
WHERE EmployeeID = @ManagerID
UNION ALL
SELECT e.EmployeeID, e.EmployeeName, ec.Level + 1
FROM Employees e
JOIN EmployeeCTE ec ON e.ManagerID = ec.EmployeeID
)
INSERT INTO @Result
SELECT EmployeeID, EmployeeName, Level
FROM EmployeeCTE;
RETURN;
END;
Характеристика | Функции | Хранимые процедуры |
---|---|---|
Возвращаемое значение | Обязательно | Не обязательно |
Использование | В выражениях SQL | EXECUTE/CALL |
Модификация данных | Ограничена (кроме CLR) | Полная |
Транзакции | Не поддерживаются | Поддерживаются |
OUT-параметры | Нет | Да |
Детерминированность
Функции могут быть детерминированными (всегда один результат для одних входных данных) или недетерминированными.
Встроенные системные функции
SQL Server включает множество готовых функций:
CONVERT()
, CAST()
- преобразование типовDATEADD()
, DATEDIFF()
- работа с датамиSUBSTRING()
, LEN()
- строковые операцииПроизводительность
Inline-функции обычно работают быстрее, так как оптимизатор может "встроить" их в запрос.
CREATE FUNCTION dbo.CalculateTax(
@Amount DECIMAL(18,2),
@CountryCode CHAR(2),
@IsTaxExempt BIT
)
RETURNS DECIMAL(18,2)
AS
BEGIN
DECLARE @TaxRate DECIMAL(5,2);
DECLARE @TaxAmount DECIMAL(18,2);
-- Определяем ставку налога
SELECT @TaxRate = CASE
WHEN @CountryCode = 'US' THEN 7.00
WHEN @CountryCode = 'CA' THEN 5.00
WHEN @CountryCode = 'EU' THEN 20.00
ELSE 0.00
END;
-- Применяем освобождение от налога
IF @IsTaxExempt = 1
SET @TaxRate = 0.00;
-- Вычисляем сумму налога
SET @TaxAmount = @Amount * @TaxRate / 100;
RETURN @TaxAmount;
END;
Изменение функции:
ALTER FUNCTION dbo.FunctionName ...
Удаление функции:
DROP FUNCTION [IF EXISTS] dbo.FunctionName;
Просмотр списка функций:
SELECT name, type_desc
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF');
Не могут:
Могут (с ограничениями):
Резюмируем: функции в SQL Server — это мощный инструмент для инкапсуляции логики вычислений и повторного использования кода. Они идеально подходят для преобразования данных, сложных расчетов и модульного проектирования SQL-кода, но имеют определенные ограничения по сравнению с хранимыми процедурами.