В SQL (Structured Query Language) используется огромное множество функций. Статья посвящена особенностям их создания и использования. Изучайте материал или освежайте свои знания. Правильное применение алгоритмов их создания и применения поможет стать первоклассным высокооплачиваемым специалистом, востребованным на рынке труда.
В MS SQL разрешено использование как функций, предоставляемых самой системой (встроенных), так и созданных пользователями (пользовательских). Рассмотрим подробнее различные категории вышеперечисленных функций.
Функции встроенные
В SQL встроено огромное множество функций. К ним относятся:
- строковые – для работы со строками;
- числовые – для работы с числами;
- даты – для работы с датами и временем;
- расширенные.
Ранжирующие
В MS SQL функции, которые всем строкам внутри секций возвращают ранжирующие значения, называются ранжирующими. В зависимости от того, какого типа функции используются, значения определенных строк могут совпадать или нет.
Такие функции относятся к недетерминированным.
Агрегатные
Функции, которые производят вычислительные действия на наборах значений и возвращающие одиночные показатели, называются агрегатными. В них не учитываются показатели NULL, за исключением лишь COUNT(*). Довольно часто их применяют в выражении GROUP BY внутри инструкции SELECT.
Они могут использоваться в:
- команде HAVING в SELECT;
- списках выбора.
Также они могут сочетаться с предложениями:
- GROUP BY – для осуществления статистических расчетов, производимых на основании категорий строк;
- OVER, чтобы на основании заданной амплитуды значений найти статистическое. Оно не может использоваться вслед за функциями GROUPING, GROUPING_ID, STRING_AGG.
Агрегатные функции для одних и тех же комплектов входящих показателей постоянно будут возвращать одинаковый итог. Потому все они относятся к детерминированным.
Аналитические
В MSSQL функции данной категории производят вычисления стат. значений по группам строк. Аналитические отличаются от агрегатных тем, что первые способны возвращать по несколько строк для каждой группы.
Они используются для определения:
- скользящих средних;
- доли в процентах;
- промежуточных результатов;
- первых N результатов в группах.
NEXT VALUE FOR (T-SQL)
Она создает номер последовательности из определенного объекта последовательности. Может применяться в хранимых процедурах и триггерах.
NEXT VALUE FOR относится к недетерминированным функциям и допускается лишь при правильном определении номера из последовательности, которая формируется.
Наборы строк
Они отвечают за возврат объектов, которые могут быть применены таким же образом, как в SQL используются ссылки табличные.
Встроенные скалярные
Те функции, которые выполняют обработку и возвращают одиночные значения, называют скалярными. Могут использоваться везде, где только могут допускаться выражения.
Они делятся на следующие категории функций:
- конфигурации – отвечают за возврат данных о действующих конфигурациях;
- преобразования – поддерживают приведение и преобразовывают данные разных типов;
- работы с курсорами – отвечают за возврат информации о курсорах;
- ф-ций и типов данных даты и времени – производят операции над исходящими значениями дата/ время, отвечают за возврат значений строк и чисел, вместе с датой и временем;
- JSON – работают с данными JSON (выполняют запросы, проверку, вносят изменения);
- логические – осуществляют логические операции;
- математические – производят вычисления, которые основаны на числах, что были переданы в качестве аргументов и возвращают значения в числах;
- метаданных – отвечают за возврат данных как о самих базах данных (БД), так и о принадлежащих им объектах;
- безопасности – возвращают информацию о пользователях и какими ролями они наделены;
- строковые – выполняют операции со строковыми входными значениями (char либо varchar) и возвращают значения (в виде строк или чисел);
- системные – выполняют операции над разными объектами, значениями, параметрами экземпляров SQL Server и возвращают информацию о них;
- системные статистические – возвращают статистические данные о системе;
- обработки текстов и изображений – выполняют различные операции над текстовыми, графическими значениями, столбцами и возвращают данные о них.
Оконные
В начале данной функции всегда находится оператор OVER. Настройка осуществляется при участии инструкций PARTITION BY, ORDER BY и ROWS. Их реализация стала возможна начиная со SQL Server 2005.
Преимущества их использования:
- возвращают такое же количество значений, сколько было получено на входе, а не уменьшают число строк;
- могут обращаться к иным строкам;
- вычисляют скользящие средние и кумулятивные суммы;
- дают больше свободы по сравнению с использованием оператора JOIN.
Инструкция SELECT – предложение OVER (T-SQL)
Данная инструкция выступает в качестве определяющей секционирование и урегулирование набора строчек до того, как будет применена соответствующая оконная функция. Так предложение OVER указывает окно либо внутри результирующих наборов Queries – набор строк, который определяет пользователь. После этого оконная функция производит вычисление значений для каждой строчки в окне.
Можно применяться вместе с функциями для нахождения стат. значений.
Детерминированные и недетерминированные
Все встроенные функции бывают:
- детерминированные – для входящих значений они постоянно возвращают один и тот же результат;
- недетерминированными – для одних и тех же исходящих значений возвращают разные результаты.
Параметры сортировки
Параметры сортировки:
- входных строк для строчек вывода применяют те же SQL функции, которые вводят и выдают символьные строки;
- при выводе для текущей БД по умолчанию используют такие ф-ции, которые обрабатывают не символьные исходные данные, а возвращают символьные строчки;
- для строк вывода на основе правил очередности параметров сортировки задают функции, которые в качестве исходных обрабатывают указанное число символьных строк и возвращают символьную строчку.
Функции, определяемые пользователем
В каждом случае функции возвращают одно значение, чем и отличаются от хранимых процедур. Особый интерес вызывают UDF. Это функции, которые пользователь определяет самостоятельно (UDF – User Defined Functions). В Microsoft SQL предоставленные системой встроенные функции можно расширять, создавая самостоятельно пользовательские – UDF.
Они получают параметры (от 0 и более) и возвращают скалярное значение либо таблицу. Для входящих параметров может использоваться любой тип данных. Исключение составляют timestamp, cursor, table.
Различают несколько типов UDF:
- скалярные – аналогичны со скалярными встроенными;
- возвращающие табличное значение – возвращают итог инструкции SELECT;
- мультиоператорные – возвращают T-SQL таблицу, которая создана оператором (одним либо несколькими). Это схоже с хранимыми процедурами, однако отличаются от них тем, что в WHERE можно ссылаться на такие UDF, как на просматриваемый объект.
Создание и выполнение
Процесс формирования UDF очень схож с тем, как создаются объекты просмотра и процедур. Они формируются при помощи инструкции CREATE FUNCTION.
UDF может быть использована только пользователями, наделенными ролями sysadmin, db_owner, db_ddladmin. Однако пользователи с перечисленными ролями могут присваивать аналогичные права иным пользователям, воспользовавшись инструкцией GRANT CREATE FUNCTION.
Объявления будут отличаться в зависимости от типа хранимой функции.
Инструкция CREATE FUNCTION
Как сказано выше, с помощью CREATE FUNCTION создаются UDF, которые представляют собой подпрограммы среды CLR или T-SQL. CREATE FUNCTION позволяет создавать именно такие подпрограммы.
В дальнейшем подпрограммы, созданные данной инструкцией, могут применяться:
- инструкциями Transact-SQL (к примеру, SELECT);
- приложениями, участвующими в вызове функций;
- при определении иной UDF;
- чтобы определить параметры представления либо улучшить функциональные возможности индексированных представлений;
- при определении столбцов таблиц;
- чтобы определить ограничения на столбец CHECK;
- чтобы заменить хранимые процедуры;
- для политики безопасности.
Скалярные в T-SQL
После указания инструкции CREATE FUNCTION следует указать имя функции вместе с параметрами, подлежащими передаче. Параметры функции SQL указываются в круглых скобках, путем перечисления и разделения запятыми. Именно это и есть основное отличие от процедур, и его не нужно забывать.
Далее следует указать ключевое слово RETURNS вместе с описанием типа значения, подлежащего возврату. Для скалярной функции данный тип может быть любым (строкой, числом, датой), но тоже скалярным.
Код выполняемой функции должен быть вписан внутри блока ключевых слов BEGIN/ END. В середине кода могут указываться любые операторы T-SQL. В этот блок могут быть включены также инструкции: присвоения (к примеру, SET), управления процессом выполнения (WHILE и IF), DECLARE, SELECT.
Вызов функций, которые определяют пользователи
UDF могут быть вызваны инструкциями T-SQL: SELECT, UPDATE, INSERT, DELETE.
Для вызова UDF следует указать ее название, на забыв приписать пару круглых скобок. Внутри скобок указывается аргумент (от одного и более), которым может выступать значение либо выражение, передающееся входными параметрами. Они обозначаются вслед за наименованием UDF.
Если при вызове функции для параметров не указаны значения по умолчанию, то для них должны быть предоставлены аргументы, определенные в том же порядке, как и в CREATE FUNCTION. Наименования в инструкциях T-SQL должны задаваться с помощью имен, состоящих из пары слов: function name, schema name и т.д.
Возвращающие таблицу
Пользователь может создавать функции, для которых результат будет возвращаться в виде таблицы. Они также создаются оператором CREATE FUNCTION. Рядом с ним следует указать наименование функции и круглые скобки, но в них не следует ничего указывать. Если рядом с именем не вписать скобок, то сервер вернет ошибку, а сама функция не будет сформирована.
Если в операторе RETURNS будет указано, что данные имеют тип TABLE, то значит функция должна будет вернуть таблицу. Также должны присутствовать ключевые слова AS и RETURN с указанием значения, которое будет возвращено. Внутри RETURN в круглых скобках должен быть указан запрос, итог которого и будет возвращен.
Их классификация зависит от способа, определяющего тело UDF. Они могут быть:
- inline – встраиваемые, где рядом с TABLE внутри предложения RETURNS отсутствует сопровождающий список столбцов. Оператором SELECT будет возвращен результирующий набор в виде значения с типом данных TABLE;
- multistatement – многоинструкционные, они включают наименование переменной и ключевое слово TABLE, определяющее тип данных. Указанные строки будут вставлены в переменную, которая выступает возвращаемым значением самой функции.
При написании запросов, во всех его полях необходимо указывать имя. Отсутствие имени хотя бы в одном поле спровоцирует возврат ошибки, когда будет выполняться инструкция CREATE FUNCTION.
Инструкция APPLY
Данная инструкция является реляционной. Ее применение вызовет UDF, возвращающее таблицу для всех строчек табличного выражения.
APPLY задают в предложении FROM внутри инструкции SELECT. Ее можно объединять с табличной функцией, чтобы получить результат, схожий с результирующим набором операции объединения двух таблиц.
Инструкция APPLY имеет две формы:
- CROSS APPLY – возвращает строки из внутреннего выражения таблицы (левого), совпадающие с внешним выражением таблицы (правым). Данная форма логически работает аналогично инструкции INNER JOIN;
- OUTER APPLY – возвращает все строки из внутреннего выражения таблицы (левого). В том случае, когда строчки не имеют совпадений во внешнем выражении таблицы, тогда в столбцах внешнего выражения таблицы они содержат NULL. Данная форма логически работает аналогично инструкции LEFT OUTER JOIN.
Опции
В процессе создания UDF можно использовать одну или обе опции:
- SCHEMABINDING – привязки к схеме. Объекты БД, на которые ссылается функция, созданная с данной опцией, не могут изменяться (с помощью ALTER) или удаляться (оператором DROP);
- ENCRYPTION – шифрования текста функции внутри системных таблиц.
Допускается, что UDF может быть связана со схемой, только при выполнении условий:
- все функции, которые указаны пользователем и объекты просмотра, на которые они ссылаются, связаны со схемой через опцию SCHEMABINDING;
- объекты, на которые ссылается функция, используют имена, состоящие из двух частей;
- объекты, как и сами функции располагаются в одной БД;
- пользователь, создающий функцию, наделен правами доступа к объектам, на которые она ссылается.
Параметры, возвращающие таблицу
В более ранних версиях MS SQL Server, существовавших до SQL Server 2008 значительные сложности вызывала задача передачи множественных параметров подпрограмме. Необходимо было проделать ряд действий: создать временную таблицу, после чего вставить в нее передаваемые показатели. И лишь после этого могла быть вызвана подпрограмма.
Версия SQL Server 2008 значительно упростила решение данной задачи. Это стало возможно с появлением параметров, возвращающих таблицу. Их применение позволяет передавать результирующий набор в соответствующую подпрограмму.
Применение таких параметров имеет ряд преимуществ:
- становится значительно проще программировать такие подпрограммы;
- сокращается число обращений к серверу и, соответственно, ответов от него;
- таблица может содержать неограниченное число строк.
Изменение и удаление UDF
Инструкция ALTER FUNCTION, поддерживаемая языком T-SQL, изменяет структуру UDF. Ее обычно применяют, чтобы удалить привязку к схеме. Параметры данной инструкции имеют значения, аналогичные одноименным параметрам инструкции CREATE FUNCTION. Для каждого вида UDF используется индивидуальный вид команд изменения.
Чтобы удалить UDF, необходимо использовать инструкцию DROP FUNCTION. Сделать это могут владельцы либо пользователи, наделенные ролями sysadmin или db_owner.
Как становится понятно, для грамотного оперирования функциями в MS SQL Server, необходимо хорошо изучить не только встроенные, но и понять алгоритмы создания пользовательских. Потому, на изучение данного материала нужно потратить достаточно времени, чтобы разобраться во всех деталях. Будем рады, если статья поможет в этом. При возникновении вопросов – обязательно задавайте их. Удачи в изучении основ MS SQL функций и алгоритмов работы с ними!
Также приглашаем на специальный курс по MS SQL.
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Особенности формирования и использования MS SQL функций OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="В SQL (Structured Query Language) используется огромное множество функций. Статья посвящена особенностям их создания и использования. Изучайте материал или освежайте свои знания. Правильное применение алгоритмов их создания и применения поможет стать первоклассным высокооплачиваемым специалистом, востребованным на рынке труда. В MS SQL разрешено использование как функций, предоставляемых самой системой (встроенных), так и созданных пользователями (пользовательских). Рассмотрим" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij\/#article","name":"\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f MS SQL \u0444\u0443\u043d\u043a\u0446\u0438\u0439 OTUS","headline":"\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f MS SQL \u0444\u0443\u043d\u043a\u0446\u0438\u0439","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2021\/08\/oj-1080x720-9.png","width":1080,"height":720},"datePublished":"2021-08-12T17:31:58+00:00","dateModified":"2021-08-12T17:31:59+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, MS SQL, SQL"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij\/#listItem","position":2,"name":"\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f MS SQL \u0444\u0443\u043d\u043a\u0446\u0438\u0439","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij\/#webpage","url":"https:\/\/otus.ru\/journal\/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij\/","name":"\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f MS SQL \u0444\u0443\u043d\u043a\u0446\u0438\u0439 OTUS","description":"\u0412 SQL (Structured Query Language) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0418\u0437\u0443\u0447\u0430\u0439\u0442\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0438\u043b\u0438 \u043e\u0441\u0432\u0435\u0436\u0430\u0439\u0442\u0435 \u0441\u0432\u043e\u0438 \u0437\u043d\u0430\u043d\u0438\u044f. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u044b\u043c \u0432\u044b\u0441\u043e\u043a\u043e\u043e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u044b\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u043c, \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u0440\u044b\u043d\u043a\u0435 \u0442\u0440\u0443\u0434\u0430. \u0412 MS SQL \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0441\u0430\u043c\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 (\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445), \u0442\u0430\u043a \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445). \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2021\/08\/oj-1080x720-9.png","@id":"https:\/\/otus.ru\/journal\/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij\/#mainImage","width":1080,"height":720},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij\/#mainImage"},"datePublished":"2021-08-12T17:31:58+00:00","dateModified":"2021-08-12T17:31:59+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/1732" /><link rel='shortlink' href='https://otus.ru/journal/?p=1732' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fosobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fosobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-1732 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-1732" class="the-post post-1732 post type-post status-publish format-standard has-post-thumbnail category-polza tag-ms-sql tag-sql">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Особенности формирования и использования MS SQL функций
</h1>
<a href="https://otus.ru/journal/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij/" class="date-link" data-wpel-link="internal"><time class="post-date">12 августа, 2021</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-9.png" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="Особенности формирования и использования MS SQL функций" title="Особенности формирования и использования MS SQL функций" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-9-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-9-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-9-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-9-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-9-270x180.png 270w" data-src="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-9-770x515.png" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5" title="Функции встроенные">Функции встроенные</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%A0%D0%B0%D0%BD%D0%B6%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B5" title="Ранжирующие">Ранжирующие</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%90%D0%B3%D1%80%D0%B5%D0%B3%D0%B0%D1%82%D0%BD%D1%8B%D0%B5" title="Агрегатные">Агрегатные</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5" title="Аналитические">Аналитические</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-5" href="#NEXT_VALUE_FOR_T-SQL" title="NEXT VALUE FOR (T-SQL)">NEXT VALUE FOR (T-SQL)</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%9D%D0%B0%D0%B1%D0%BE%D1%80%D1%8B_%D1%81%D1%82%D1%80%D0%BE%D0%BA" title="Наборы строк">Наборы строк</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-7" href="#%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%BA%D0%B0%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5" title="Встроенные скалярные">Встроенные скалярные</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-8" href="#%D0%9E%D0%BA%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5" title="Оконные">Оконные</a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-9" href="#%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F_SELECT_%E2%80%93_%D0%BF%D1%80%D0%B5%D0%B4%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_OVER_T-SQL" title="Инструкция SELECT – предложение OVER (T-SQL)">Инструкция SELECT – предложение OVER (T-SQL)</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-10" href="#%D0%94%D0%B5%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D0%BD%D0%B5%D0%B4%D0%B5%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5" title="Детерминированные и недетерминированные">Детерминированные и недетерминированные</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-11" href="#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8" title="Параметры сортировки">Параметры сортировки</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-12" href="#%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%8F%D0%B5%D0%BC%D1%8B%D0%B5_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%BC" title="Функции, определяемые пользователем">Функции, определяемые пользователем</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-13" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5" title="Создание и выполнение">Создание и выполнение</a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-14" href="#%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F_CREATE_FUNCTION" title="Инструкция CREATE FUNCTION">Инструкция CREATE FUNCTION</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-15" href="#%D0%A1%D0%BA%D0%B0%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2_T-SQL" title="Скалярные в T-SQL">Скалярные в T-SQL</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-16" href="#%D0%92%D1%8B%D0%B7%D0%BE%D0%B2_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9_%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%8F%D1%8E%D1%82_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B8" title="Вызов функций, которые определяют пользователи">Вызов функций, которые определяют пользователи</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-17" href="#%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D0%B5_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83" title="Возвращающие таблицу">Возвращающие таблицу</a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-18" href="#%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F_APPLY" title="Инструкция APPLY">Инструкция APPLY</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-19" href="#%D0%9E%D0%BF%D1%86%D0%B8%D0%B8" title="Опции">Опции</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-20" href="#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D0%B5_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83" title="Параметры, возвращающие таблицу">Параметры, возвращающие таблицу</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-21" href="#%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8_%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_UDF" title="Изменение и удаление UDF">Изменение и удаление UDF</a></li></ul></li></ul></nav></div>
<p>В SQL (Structured Query Language) используется огромное множество функций. Статья посвящена особенностям их создания и использования. Изучайте материал или освежайте свои знания. Правильное применение алгоритмов их создания и применения поможет стать первоклассным высокооплачиваемым специалистом, востребованным на рынке труда.</p>
<p>В MS SQL разрешено использование как функций, предоставляемых самой системой (встроенных), так и созданных пользователями (пользовательских). Рассмотрим подробнее различные категории вышеперечисленных функций.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5"></span>Функции встроенные<span class="ez-toc-section-end"></span></h2>
<p>В SQL встроено огромное множество функций. К ним относятся:</p>
<ul><li>строковые – для работы со строками;</li><li>числовые – для работы с числами;</li><li>даты – для работы с датами и временем;</li><li>расширенные.</li></ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B0%D0%BD%D0%B6%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B5"></span>Ранжирующие<span class="ez-toc-section-end"></span></h3>
<p>В MS SQL функции, которые всем строкам внутри секций возвращают ранжирующие значения, называются ранжирующими. В зависимости от того, какого типа функции используются, значения определенных строк могут совпадать или нет.</p>
<p>Такие функции относятся к недетерминированным.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%90%D0%B3%D1%80%D0%B5%D0%B3%D0%B0%D1%82%D0%BD%D1%8B%D0%B5"></span>Агрегатные<span class="ez-toc-section-end"></span></h3>
<p>Функции, которые производят вычислительные действия на наборах значений и возвращающие одиночные показатели, называются агрегатными. В них не учитываются показатели NULL, за исключением лишь COUNT(*). Довольно часто их применяют в выражении GROUP BY внутри инструкции SELECT.</p>
<p>Они могут использоваться в:</p>
<ul><li>команде HAVING в SELECT;</li><li>списках выбора.</li></ul>
<p>Также они могут сочетаться с предложениями:</p>
<ul><li>GROUP BY – для осуществления статистических расчетов, производимых на основании категорий строк;</li><li>OVER, чтобы на основании заданной амплитуды значений найти статистическое. Оно не может использоваться вслед за функциями GROUPING, GROUPING_ID, STRING_AGG.</li></ul>
<p>Агрегатные функции для одних и тех же комплектов входящих показателей постоянно будут возвращать одинаковый итог. Потому все они относятся к детерминированным.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5"></span>Аналитические<span class="ez-toc-section-end"></span></h3>
<p>В MSSQL функции данной категории производят вычисления стат. значений по группам строк. Аналитические отличаются от агрегатных тем, что первые способны возвращать по несколько строк для каждой группы.</p>
<p>Они используются для определения:</p>
<ul><li>скользящих средних;</li><li>доли в процентах;</li><li>промежуточных результатов;</li><li>первых N результатов в группах.</li></ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="NEXT_VALUE_FOR_T-SQL"></span>NEXT VALUE FOR (T-SQL)<span class="ez-toc-section-end"></span></h3>
<p>Она создает номер последовательности из определенного объекта последовательности. Может применяться в хранимых процедурах и триггерах.</p>
<p>NEXT VALUE FOR относится к недетерминированным функциям и допускается лишь при правильном определении номера из последовательности, которая формируется.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9D%D0%B0%D0%B1%D0%BE%D1%80%D1%8B_%D1%81%D1%82%D1%80%D0%BE%D0%BA"></span>Наборы строк<span class="ez-toc-section-end"></span></h3>
<p>Они отвечают за возврат объектов, которые могут быть применены таким же образом, как в SQL используются ссылки табличные.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%BA%D0%B0%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5"></span>Встроенные скалярные<span class="ez-toc-section-end"></span></h3>
<p>Те функции, которые выполняют обработку и возвращают одиночные значения, называют скалярными. Могут использоваться везде, где только могут допускаться выражения.</p>
<p>Они делятся на следующие категории функций:</p>
<ul><li>конфигурации – отвечают за возврат данных о действующих конфигурациях;</li><li>преобразования – поддерживают приведение и преобразовывают данные разных типов;</li><li>работы с курсорами – отвечают за возврат информации о курсорах;</li><li>ф-ций и типов данных даты и времени – производят операции над исходящими значениями дата/ время, отвечают за возврат значений строк и чисел, вместе с датой и временем;</li><li>JSON – работают с данными JSON (выполняют запросы, проверку, вносят изменения);</li><li>логические – осуществляют логические операции;</li><li>математические – производят вычисления, которые основаны на числах, что были переданы в качестве аргументов и возвращают значения в числах;</li><li>метаданных – отвечают за возврат данных как о самих базах данных (БД), так и о принадлежащих им объектах;</li><li>безопасности – возвращают информацию о пользователях и какими ролями они наделены;</li><li>строковые – выполняют операции со строковыми входными значениями (char либо varchar) и возвращают значения (в виде строк или чисел);</li><li>системные – выполняют операции над разными объектами, значениями, параметрами экземпляров SQL Server и возвращают информацию о них;</li><li>системные статистические – возвращают статистические данные о системе;</li><li>обработки текстов и изображений – выполняют различные операции над текстовыми, графическими значениями, столбцами и возвращают данные о них.</li></ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BA%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5"></span>Оконные<span class="ez-toc-section-end"></span></h3>
<p>В начале данной функции всегда находится оператор OVER. Настройка осуществляется при участии инструкций PARTITION BY, ORDER BY и ROWS. Их реализация стала возможна начиная со SQL Server 2005.</p>
<p>Преимущества их использования:</p>
<ul><li>возвращают такое же количество значений, сколько было получено на входе, а не уменьшают число строк;</li><li>могут обращаться к иным строкам;</li><li>вычисляют скользящие средние и кумулятивные суммы;</li><li>дают больше свободы по сравнению с использованием оператора JOIN.</li></ul>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F_SELECT_%E2%80%93_%D0%BF%D1%80%D0%B5%D0%B4%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_OVER_T-SQL"></span>Инструкция SELECT – предложение OVER (T-SQL)<span class="ez-toc-section-end"></span></h4>
<p>Данная инструкция выступает в качестве определяющей секционирование и урегулирование набора строчек до того, как будет применена соответствующая оконная функция. Так предложение OVER указывает окно либо внутри результирующих наборов Queries – набор строк, который определяет пользователь. После этого оконная функция производит вычисление значений для каждой строчки в окне.</p>
<p>Можно применяться вместе с функциями для нахождения стат. значений.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%94%D0%B5%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D0%BD%D0%B5%D0%B4%D0%B5%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5"></span>Детерминированные и недетерминированные<span class="ez-toc-section-end"></span></h3>
<p>Все встроенные функции бывают:</p>
<ul><li>детерминированные – для входящих значений они постоянно возвращают один и тот же результат;</li><li>недетерминированными – для одних и тех же исходящих значений возвращают разные результаты.</li></ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8"></span>Параметры сортировки<span class="ez-toc-section-end"></span></h3>
<p>Параметры сортировки:</p>
<ul><li>входных строк для строчек вывода применяют те же SQL функции, которые вводят и выдают символьные строки;</li><li>при выводе для текущей БД по умолчанию используют такие ф-ции, которые обрабатывают не символьные исходные данные, а возвращают символьные строчки;</li><li>для строк вывода на основе правил очередности параметров сортировки задают функции, которые в качестве исходных обрабатывают указанное число символьных строк и возвращают символьную строчку.</li></ul>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%8F%D0%B5%D0%BC%D1%8B%D0%B5_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%BC"></span>Функции, определяемые пользователем<span class="ez-toc-section-end"></span></h2>
<p>В каждом случае функции возвращают одно значение, чем и отличаются от хранимых процедур. Особый интерес вызывают UDF. Это функции, которые пользователь определяет самостоятельно (UDF – User Defined Functions). В Microsoft SQL предоставленные системой встроенные функции можно расширять, создавая самостоятельно пользовательские – UDF.</p>
<p>Они получают параметры (от 0 и более) и возвращают скалярное значение либо таблицу. Для входящих параметров может использоваться любой тип данных. Исключение составляют timestamp, cursor, table. </p>
<p>Различают несколько типов UDF:</p>
<ul><li>скалярные – аналогичны со скалярными встроенными;</li><li>возвращающие табличное значение – возвращают итог инструкции SELECT;</li><li>мультиоператорные – возвращают T-SQL таблицу, которая создана оператором (одним либо несколькими). Это схоже с хранимыми процедурами, однако отличаются от них тем, что в WHERE можно ссылаться на такие UDF, как на просматриваемый объект.</li></ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5"></span>Создание и выполнение<span class="ez-toc-section-end"></span></h3>
<p>Процесс формирования UDF очень схож с тем, как создаются объекты просмотра и процедур. Они формируются при помощи инструкции CREATE FUNCTION.</p>
<p>UDF может быть использована только пользователями, наделенными ролями sysadmin, db_owner, db_ddladmin. Однако пользователи с перечисленными ролями могут присваивать аналогичные права иным пользователям, воспользовавшись инструкцией GRANT CREATE FUNCTION.</p>
<p>Объявления будут отличаться в зависимости от типа хранимой функции.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F_CREATE_FUNCTION"></span>Инструкция CREATE FUNCTION<span class="ez-toc-section-end"></span></h4>
<p>Как сказано выше, с помощью CREATE FUNCTION создаются UDF, которые представляют собой подпрограммы среды CLR или T-SQL. CREATE FUNCTION позволяет создавать именно такие подпрограммы.</p>
<p>В дальнейшем подпрограммы, созданные данной инструкцией, могут применяться:</p>
<ul><li>инструкциями Transact-SQL (к примеру, SELECT);</li><li>приложениями, участвующими в вызове функций;</li><li>при определении иной UDF;</li><li>чтобы определить параметры представления либо улучшить функциональные возможности индексированных представлений;</li><li>при определении столбцов таблиц;</li><li>чтобы определить ограничения на столбец CHECK;</li><li>чтобы заменить хранимые процедуры;</li><li>для политики безопасности.</li></ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%BA%D0%B0%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2_T-SQL"></span>Скалярные в T-SQL<span class="ez-toc-section-end"></span></h3>
<p>После указания инструкции CREATE FUNCTION следует указать имя функции вместе с параметрами, подлежащими передаче. Параметры функции SQL указываются в круглых скобках, путем перечисления и разделения запятыми. Именно это и есть основное отличие от процедур, и его не нужно забывать.</p>
<p>Далее следует указать ключевое слово RETURNS вместе с описанием типа значения, подлежащего возврату. Для скалярной функции данный тип может быть любым (строкой, числом, датой), но тоже скалярным.</p>
<p>Код выполняемой функции должен быть вписан внутри блока ключевых слов BEGIN/ END. В середине кода могут указываться любые операторы T-SQL. В этот блок могут быть включены также инструкции: присвоения (к примеру, SET), управления процессом выполнения (WHILE и IF), DECLARE, SELECT.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%92%D1%8B%D0%B7%D0%BE%D0%B2_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9_%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%8F%D1%8E%D1%82_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B8"></span>Вызов функций, которые определяют пользователи<span class="ez-toc-section-end"></span></h3>
<p>UDF могут быть вызваны инструкциями T-SQL: SELECT, UPDATE, INSERT, DELETE.</p>
<p>Для вызова UDF следует указать ее название, на забыв приписать пару круглых скобок. Внутри скобок указывается аргумент (от одного и более), которым может выступать значение либо выражение, передающееся входными параметрами. Они обозначаются вслед за наименованием UDF.</p>
<p>Если при вызове функции для параметров не указаны значения по умолчанию, то для них должны быть предоставлены аргументы, определенные в том же порядке, как и в CREATE FUNCTION. Наименования в инструкциях T-SQL должны задаваться с помощью имен, состоящих из пары слов: function name, schema name и т.д.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D0%B5_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83"></span>Возвращающие таблицу<span class="ez-toc-section-end"></span></h3>
<p>Пользователь может создавать функции, для которых результат будет возвращаться в виде таблицы. Они также создаются оператором CREATE FUNCTION. Рядом с ним следует указать наименование функции и круглые скобки, но в них не следует ничего указывать. Если рядом с именем не вписать скобок, то сервер вернет ошибку, а сама функция не будет сформирована.</p>
<p>Если в операторе RETURNS будет указано, что данные имеют тип TABLE, то значит функция должна будет вернуть таблицу. Также должны присутствовать ключевые слова AS и RETURN с указанием значения, которое будет возвращено. Внутри RETURN в круглых скобках должен быть указан запрос, итог которого и будет возвращен.</p>
<p>Их классификация зависит от способа, определяющего тело UDF. Они могут быть:</p>
<ul><li>inline – встраиваемые, где рядом с TABLE внутри предложения RETURNS отсутствует сопровождающий список столбцов. Оператором SELECT будет возвращен результирующий набор в виде значения с типом данных TABLE;</li><li>multistatement – многоинструкционные, они включают наименование переменной и ключевое слово TABLE, определяющее тип данных. Указанные строки будут вставлены в переменную, которая выступает возвращаемым значением самой функции.</li></ul>
<p>При написании запросов, во всех его полях необходимо указывать имя. Отсутствие имени хотя бы в одном поле спровоцирует возврат ошибки, когда будет выполняться инструкция CREATE FUNCTION.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F_APPLY"></span>Инструкция APPLY<span class="ez-toc-section-end"></span></h4>
<p>Данная инструкция является реляционной. Ее применение вызовет UDF, возвращающее таблицу для всех строчек табличного выражения.</p>
<p>APPLY задают в предложении FROM внутри инструкции SELECT. Ее можно объединять с табличной функцией, чтобы получить результат, схожий с результирующим набором операции объединения двух таблиц.</p>
<p>Инструкция APPLY имеет две формы:</p>
<ul><li>CROSS APPLY – возвращает строки из внутреннего выражения таблицы (левого), совпадающие с внешним выражением таблицы (правым). Данная форма логически работает аналогично инструкции INNER JOIN;</li><li>OUTER APPLY – возвращает все строки из внутреннего выражения таблицы (левого). В том случае, когда строчки не имеют совпадений во внешнем выражении таблицы, тогда в столбцах внешнего выражения таблицы они содержат NULL. Данная форма логически работает аналогично инструкции LEFT OUTER JOIN.</li></ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BF%D1%86%D0%B8%D0%B8"></span>Опции<span class="ez-toc-section-end"></span></h3>
<p>В процессе создания UDF можно использовать одну или обе опции:</p>
<ul><li>SCHEMABINDING – привязки к схеме. Объекты БД, на которые ссылается функция, созданная с данной опцией, не могут изменяться (с помощью ALTER) или удаляться (оператором DROP);</li><li>ENCRYPTION – шифрования текста функции внутри системных таблиц.</li></ul>
<p>Допускается, что UDF может быть связана со схемой, только при выполнении условий:</p>
<ul><li>все функции, которые указаны пользователем и объекты просмотра, на которые они ссылаются, связаны со схемой через опцию SCHEMABINDING;</li><li>объекты, на которые ссылается функция, используют имена, состоящие из двух частей;</li><li>объекты, как и сами функции располагаются в одной БД;</li><li>пользователь, создающий функцию, наделен правами доступа к объектам, на которые она ссылается.</li></ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D0%B5_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83"></span>Параметры, возвращающие таблицу<span class="ez-toc-section-end"></span></h3>
<p>В более ранних версиях MS SQL Server, существовавших до SQL Server 2008 значительные сложности вызывала задача передачи множественных параметров подпрограмме. Необходимо было проделать ряд действий: создать временную таблицу, после чего вставить в нее передаваемые показатели. И лишь после этого могла быть вызвана подпрограмма.</p>
<p>Версия SQL Server 2008 значительно упростила решение данной задачи. Это стало возможно с появлением параметров, возвращающих таблицу. Их применение позволяет передавать результирующий набор в соответствующую подпрограмму.</p>
<p>Применение таких параметров имеет ряд преимуществ:</p>
<ul><li>становится значительно проще программировать такие подпрограммы;</li><li>сокращается число обращений к серверу и, соответственно, ответов от него;</li><li>таблица может содержать неограниченное число строк.</li></ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8_%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_UDF"></span>Изменение и удаление UDF<span class="ez-toc-section-end"></span></h3>
<p>Инструкция ALTER FUNCTION, поддерживаемая языком T-SQL, изменяет структуру UDF. Ее обычно применяют, чтобы удалить привязку к схеме. Параметры данной инструкции имеют значения, аналогичные одноименным параметрам инструкции CREATE FUNCTION. Для каждого вида UDF используется индивидуальный вид команд изменения.</p>
<p>Чтобы удалить UDF, необходимо использовать инструкцию DROP FUNCTION. Сделать это могут владельцы либо пользователи, наделенные ролями sysadmin или db_owner.</p>
<p>Как становится понятно, для грамотного оперирования функциями в MS SQL Server, необходимо хорошо изучить не только встроенные, но и понять алгоритмы создания пользовательских. Потому, на изучение данного материала нужно потратить достаточно времени, чтобы разобраться во всех деталях. Будем рады, если статья поможет в этом. При возникновении вопросов – обязательно задавайте их. Удачи в изучении основ MS SQL функций и алгоритмов работы с ними!</p>
<figure class="wp-block-image size-large"><a href="https://otus.ru/lessons/subd/?utm_source=oj&utm_medium=affilate&utm_campaign=subd" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><img decoding="async" width="970" height="90" src="https://otus.ru/journal/wp-content/uploads/2021/08/SUBD_970x90-20219-543a9a-2.png" alt="Особенности формирования и использования MS SQL функций" class="wp-image-1735" srcset="https://otus.ru/journal/wp-content/uploads/2021/08/SUBD_970x90-20219-543a9a-2.png 970w, https://otus.ru/journal/wp-content/uploads/2021/08/SUBD_970x90-20219-543a9a-2-300x28.png 300w, https://otus.ru/journal/wp-content/uploads/2021/08/SUBD_970x90-20219-543a9a-2-150x14.png 150w, https://otus.ru/journal/wp-content/uploads/2021/08/SUBD_970x90-20219-543a9a-2-768x71.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></a></figure>
<p>Также приглашаем на <a href="https://otus.ru/lessons/ms-sql-server-razrabotchik/?utm_source=oj&utm_medium=affilate&utm_campaign=sql" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">специальный курс по MS SQL<span class="wpel-icon wpel-image wpel-icon-6"></span></a>.</p>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/ms-sql/" rel="tag" data-wpel-link="internal">MS SQL</a><a href="https://otus.ru/journal/tag/sql/" rel="tag" data-wpel-link="internal">SQL</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Fosobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fosobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij%2F&text=%D0%9E%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B8%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20MS%20SQL%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Fosobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fosobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2021%2F08%2Foj-1080x720-9.png&description=%D0%9E%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B8%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20MS%20SQL%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/kratkij-obzor-oblachnyh-hranilishh/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/kratkij-obzor-oblachnyh-hranilishh/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="100" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20100%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Краткий обзор облачных хранилищ" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-6-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-6-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-6-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-6-768x512.png 768w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-6-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-6-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-6-370x245.png 370w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-6.png 1080w" data-src="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-6-150x100.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Краткий обзор облачных хранилищ" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/kratkij-obzor-oblachnyh-hranilishh/" data-wpel-link="internal">Краткий обзор облачных хранилищ</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/kratkij-obzor-oblachnyh-hranilishh/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2021-08-11T11:31:41+00:00">11 августа, 2021</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">9 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/poleznoe-dlya-programmistov-o-javascript-peremennye-metody-funkcii/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/poleznoe-dlya-programmistov-o-javascript-peremennye-metody-funkcii/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="100" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20100%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Полезное для программистов о JavaScript: переменные, методы, функции" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-10-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-10-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-10-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-10-768x512.png 768w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-10-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-10-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-10-370x245.png 370w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-10.png 1080w" data-src="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-10-150x100.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Полезное для программистов о JavaScript: переменные, методы, функции" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/poleznoe-dlya-programmistov-o-javascript-peremennye-metody-funkcii/" data-wpel-link="internal">Полезное для программистов о JavaScript: переменные, методы, функции</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/poleznoe-dlya-programmistov-o-javascript-peremennye-metody-funkcii/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2021-08-13T19:50:21+00:00">13 августа, 2021</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">8 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/osobennosti-formirovaniya-i-ispolzovaniya-ms-sql-funkcij\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Tue, 10 Mar 2026 18:29:52 GMT -->