Функции (компонент Database Engine)

SQL Server предоставляет встроенные функции, которые служат для выполнения различных операций.

Функции можно использовать и включать в следующие конструкции.

  • Список выбора инструкции SELECT.

    SELECT DB_NAME();
    GO
    
  • Предложение WHERE инструкций SELECT, INSERT, DELETE или UPDATE для ограничения количества строк, удовлетворяющих условиям запроса.

    USE AdventureWorks2008R2;
    GO
    SELECT SalesOrderID, ProductID, OrderQty
    FROM Sales.SalesOrderDetail
    WHERE OrderQty =
       (SELECT MAX(OrderQty) FROM Sales.SalesOrderDetail);
    GO
    
  • Условие поиска в предложении WHERE представления, которое должно динамически соответствовать пользователю или среде во время выполнения.

    CREATE VIEW ShowMyEmploymentInfo AS
    SELECT FirstName, LastName
    FROM Person.Person
    WHERE BusinessEntityID = SUSER_SID();
    GO
    
  • Любое выражение.

  • Ограничение CHECK или триггер для поиска указанных значений при вставке данных.

    CREATE TABLE SalesContacts
       (SalesRepID   INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ),
       ContactName   VARCHAR(50) NULL,
       ContactPhone   VARCHAR(13) NULL);
    GO
    
  • Ограничение DEFAULT или триггер для вставки значений по умолчанию, которые не указаны в инструкции INSERT.

    CREATE TABLE SalesContacts
       (
       SalesRepID   INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ),
       ContactName   VARCHAR(50) NULL,
       ContactPhone   VARCHAR(13) NULL,
       WhenCreated   DATETIME DEFAULT GETDATE(),
       Creator      INT DEFAULT SUSER_SID()
       );
    GO
    

Вызов функции сопровождается круглыми скобками, даже если она не имеет параметров. Исключение составляют функции без аргументов, которые используются с ключевым словом DEFAULT. Функции без аргументов не имеют параметров. Дополнительные сведения о ключевом слове DEFAULT см. в разделе ALTER TABLE (Transact-SQL) и Инструкция CREATE TABLE (Transact-SQL).

Иногда параметры, определяющие базы данных, компьютер, имя входа или пользователя базы данных являются необязательными. Если они не указаны, используются текущая база данных, узел, имя входа или пользователь базы данных.

Функции могут быть вложенными.

Категории функций

В следующей таблице перечислены категории функций SQL Server.

Категория функции

Описание

Статистические функции (Transact-SQL)

Выполняют операции, объединяющие несколько значений в одно. Примерами таких функций являются COUNT, SUM, MIN и MAX.

Функции настройки

Скалярные функции, возвращающие сведения о параметрах конфигурации.

Криптографические функции (Transact-SQL)

Поддерживают шифрование, дешифрование, цифровые подписи и их проверку.

Функции для работы с курсорами

Возвращают сведения о состоянии курсора.

Функции даты и времени

Изменяют значения даты и времени.

Математические функции

Служат для выполнения тригонометрических, геометрических и других математических операций.

Функции метаданных

Возвращают сведения об атрибутах баз данных и объектов баз данных.

Ранжирующая функция

Недетерминированные функции, возвращающие ранжирующее значение для каждой строки секции.

Функции наборов строк (Transact-SQL)

Возвращают результирующие наборы, которые можно использовать вместо ссылок на таблицу в инструкции Transact-SQL.

Функции безопасности

Возвращают сведения о пользователях и ролях.

Строковые функции

Изменяют значения char, varchar, nchar, nvarchar, binary и varbinary.

Системные функции

Работают или возвращают отчет о различных параметрах и объектах уровня системы.

Системные статистические функции (Transact-SQL)

Возвращают сведения о производительности SQL Server.

Функции обработки текста и изображений

Изменяют значения text и image.

Детерминированные и недетерминированные функции

Все функции SQL Server делятся на строго детерминированные, детерминированные и недетерминированные.

Функция называется строго детерминированной, если для некоторого набора входных значений функция всегда возвращает одни и те же результаты.

Для пользовательских функций применяется менее строгое определение. Пользовательская функция называется детерминированной, если для некоторого набора входных значений и состояния базы данных функция всегда возвращает одни и те же результаты. В этом понимании функция, которая не является строго детерминированной, может быть детерминированной, если обращается к данным.

Недетерминированная функция может вернуть разные результаты, если ее несколько раз подряд вызвать с одними и теми же входными значениями. Например, функция GETDATE() является недетерминированной. SQL Server накладывает ограничения на различные классы детерминизма. Таким образом, недетерминированные функции следует использовать осторожно.

Для встроенных функций понятия «детерминированный» и «строго детерминированный» обозначают одно и то же. Система проверяет определение пользовательских функций Transact-SQL и не позволяет создавать недетерминированные функции. Тем не менее, функции, которые обращаются к данным или не привязаны к схеме, считаются не строго детерминированными. Определение функций среды CLR содержит свойства детерминизма, доступа к данным и доступа к системным данным, но поскольку эти свойства не проверяются системой, функции всегда считаются не строго детерминированными.

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

Если функция не является строго детерминированной, ее производительность может не подлежать оптимизации. Для сохранения корректности некоторые шаги реорганизации плана выполнения пропускаются. Кроме того, количество, порядок и время между вызовами пользовательских функций зависят от реализации. Не полагайтесь на эту семантику вызовов. Кроме постоянных недетерминированных функций RAND и семейства GETDATE, количество, порядок и время между вызовами будут зависеть от выбранного плана.

Рекомендации

По возможности следует выполнять следующие рекомендации.

1. Пишите строго детерминированные функции, если это возможно. В частности, функции Transact-SQL можно привязывать к схеме.

2. Старайтесь использовать недетерминированные функции в самом внешнем из возможных списков выбора.

3. Не используйте недетерминированные функции в запросах, которые критичны к производительности.

4. Не полагайтесь на количество, порядок и время между вызовами, поскольку они могут зависеть от реализации.

Дополнительные сведения см. в разделе Детерминированные и недетерминированные функции.