Что такое функция в SQL Server?sql-25

Функция в SQL Server — это именованный объект базы данных, который содержит набор SQL-операторов и возвращает значение. В отличие от хранимых процедур, функции всегда возвращают результат (скалярное значение или таблицу) и могут использоваться в SQL-выражениях.

Основные характеристики функций

  1. Обязательное возвращаемое значение
    Все функции должны возвращать результат (в отличие от процедур)

  2. Использование в запросах
    Функции можно вызывать внутри SELECT, WHERE и других выражений

  3. Ограничения
    Не могут модифицировать состояние базы данных (с некоторыми исключениями)

Типы функций в SQL Server

1. Скалярные функции

Возвращают одиночное значение определенного типа данных.

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;

2. Табличные функции

Возвращают таблицу как результат одного 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);

3. Многооператорные табличные функции

Создают и заполняют возвращаемую таблицу в теле функции.

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;

Ключевые отличия от хранимых процедур

ХарактеристикаФункцииХранимые процедуры
Возвращаемое значениеОбязательноНе обязательно
ИспользованиеВ выражениях SQLEXECUTE/CALL
Модификация данныхОграничена (кроме CLR)Полная
ТранзакцииНе поддерживаютсяПоддерживаются
OUT-параметрыНетДа

Особенности работы с функциями

  1. Детерминированность
    Функции могут быть детерминированными (всегда один результат для одних входных данных) или недетерминированными.

  2. Встроенные системные функции
    SQL Server включает множество готовых функций:

    • CONVERT(), CAST() - преобразование типов
    • DATEADD(), DATEDIFF() - работа с датами
    • SUBSTRING(), LEN() - строковые операции
  3. Производительность
    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');

Ограничения функций

  1. Не могут:

    • Вызывать хранимые процедуры (кроме расширенных)
    • Использовать динамический SQL
    • Изменять состояние базы данных (INSERT/UPDATE/DELETE)
  2. Могут (с ограничениями):

    • Вызывать другие функции
    • Использовать временные таблицы (в multi-statement функциях)
    • Работать с курсорами

Резюмируем: функции в SQL Server — это мощный инструмент для инкапсуляции логики вычислений и повторного использования кода. Они идеально подходят для преобразования данных, сложных расчетов и модульного проектирования SQL-кода, но имеют определенные ограничения по сравнению с хранимыми процедурами.