HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-03-10
1 <ul><li><a>Функции встроенные</a><ul><li><a>Ранжирующие</a></li>
1 <ul><li><a>Функции встроенные</a><ul><li><a>Ранжирующие</a></li>
2 <li><a>Агрегатные</a></li>
2 <li><a>Агрегатные</a></li>
3 <li><a>Аналитические</a></li>
3 <li><a>Аналитические</a></li>
4 <li><a>NEXT VALUE FOR (T-SQL)</a></li>
4 <li><a>NEXT VALUE FOR (T-SQL)</a></li>
5 <li><a>Наборы строк</a></li>
5 <li><a>Наборы строк</a></li>
6 <li><a>Встроенные скалярные</a></li>
6 <li><a>Встроенные скалярные</a></li>
7 <li><a>Оконные</a><ul><li><a>Инструкция SELECT - предложение OVER (T-SQL)</a></li>
7 <li><a>Оконные</a><ul><li><a>Инструкция SELECT - предложение OVER (T-SQL)</a></li>
8 </ul></li>
8 </ul></li>
9 <li><a>Детерминированные и недетерминированные</a></li>
9 <li><a>Детерминированные и недетерминированные</a></li>
10 <li><a>Параметры сортировки</a></li>
10 <li><a>Параметры сортировки</a></li>
11 </ul></li>
11 </ul></li>
12 <li><a>Функции, определяемые пользователем</a><ul><li><a>Создание и выполнение</a><ul><li><a>Инструкция CREATE FUNCTION</a></li>
12 <li><a>Функции, определяемые пользователем</a><ul><li><a>Создание и выполнение</a><ul><li><a>Инструкция CREATE FUNCTION</a></li>
13 </ul></li>
13 </ul></li>
14 <li><a>Скалярные в T-SQL</a></li>
14 <li><a>Скалярные в T-SQL</a></li>
15 <li><a>Вызов функций, которые определяют пользователи</a></li>
15 <li><a>Вызов функций, которые определяют пользователи</a></li>
16 <li><a>Возвращающие таблицу</a><ul><li><a>Инструкция APPLY</a></li>
16 <li><a>Возвращающие таблицу</a><ul><li><a>Инструкция APPLY</a></li>
17 </ul></li>
17 </ul></li>
18 <li><a>Опции</a></li>
18 <li><a>Опции</a></li>
19 <li><a>Параметры, возвращающие таблицу</a></li>
19 <li><a>Параметры, возвращающие таблицу</a></li>
20 <li><a>Изменение и удаление UDF</a></li>
20 <li><a>Изменение и удаление UDF</a></li>
21 </ul></li>
21 </ul></li>
22 </ul><p>В SQL (Structured Query Language) используется огромное множество функций. Статья посвящена особенностям их создания и использования. Изучайте материал или освежайте свои знания. Правильное применение алгоритмов их создания и применения поможет стать первоклассным высокооплачиваемым специалистом, востребованным на рынке труда.</p>
22 </ul><p>В SQL (Structured Query Language) используется огромное множество функций. Статья посвящена особенностям их создания и использования. Изучайте материал или освежайте свои знания. Правильное применение алгоритмов их создания и применения поможет стать первоклассным высокооплачиваемым специалистом, востребованным на рынке труда.</p>
23 <p>В MS SQL разрешено использование как функций, предоставляемых самой системой (встроенных), так и созданных пользователями (пользовательских). Рассмотрим подробнее различные категории вышеперечисленных функций.</p>
23 <p>В MS SQL разрешено использование как функций, предоставляемых самой системой (встроенных), так и созданных пользователями (пользовательских). Рассмотрим подробнее различные категории вышеперечисленных функций.</p>
24 <h2>Функции встроенные</h2>
24 <h2>Функции встроенные</h2>
25 <p>В SQL встроено огромное множество функций. К ним относятся:</p>
25 <p>В SQL встроено огромное множество функций. К ним относятся:</p>
26 <ul><li>строковые - для работы со строками;</li>
26 <ul><li>строковые - для работы со строками;</li>
27 <li>числовые - для работы с числами;</li>
27 <li>числовые - для работы с числами;</li>
28 <li>даты - для работы с датами и временем;</li>
28 <li>даты - для работы с датами и временем;</li>
29 <li>расширенные.</li>
29 <li>расширенные.</li>
30 </ul><h3>Ранжирующие</h3>
30 </ul><h3>Ранжирующие</h3>
31 <p>В MS SQL функции, которые всем строкам внутри секций возвращают ранжирующие значения, называются ранжирующими. В зависимости от того, какого типа функции используются, значения определенных строк могут совпадать или нет.</p>
31 <p>В MS SQL функции, которые всем строкам внутри секций возвращают ранжирующие значения, называются ранжирующими. В зависимости от того, какого типа функции используются, значения определенных строк могут совпадать или нет.</p>
32 <p>Такие функции относятся к недетерминированным.</p>
32 <p>Такие функции относятся к недетерминированным.</p>
33 <h3>Агрегатные</h3>
33 <h3>Агрегатные</h3>
34 <p>Функции, которые производят вычислительные действия на наборах значений и возвращающие одиночные показатели, называются агрегатными. В них не учитываются показатели NULL, за исключением лишь COUNT(*). Довольно часто их применяют в выражении GROUP BY внутри инструкции SELECT.</p>
34 <p>Функции, которые производят вычислительные действия на наборах значений и возвращающие одиночные показатели, называются агрегатными. В них не учитываются показатели NULL, за исключением лишь COUNT(*). Довольно часто их применяют в выражении GROUP BY внутри инструкции SELECT.</p>
35 <p>Они могут использоваться в:</p>
35 <p>Они могут использоваться в:</p>
36 <ul><li>команде HAVING в SELECT;</li>
36 <ul><li>команде HAVING в SELECT;</li>
37 <li>списках выбора.</li>
37 <li>списках выбора.</li>
38 </ul><p>Также они могут сочетаться с предложениями:</p>
38 </ul><p>Также они могут сочетаться с предложениями:</p>
39 <ul><li>GROUP BY - для осуществления статистических расчетов, производимых на основании категорий строк;</li>
39 <ul><li>GROUP BY - для осуществления статистических расчетов, производимых на основании категорий строк;</li>
40 <li>OVER, чтобы на основании заданной амплитуды значений найти статистическое. Оно не может использоваться вслед за функциями GROUPING, GROUPING_ID, STRING_AGG.</li>
40 <li>OVER, чтобы на основании заданной амплитуды значений найти статистическое. Оно не может использоваться вслед за функциями GROUPING, GROUPING_ID, STRING_AGG.</li>
41 </ul><p>Агрегатные функции для одних и тех же комплектов входящих показателей постоянно будут возвращать одинаковый итог. Потому все они относятся к детерминированным.</p>
41 </ul><p>Агрегатные функции для одних и тех же комплектов входящих показателей постоянно будут возвращать одинаковый итог. Потому все они относятся к детерминированным.</p>
42 <h3>Аналитические</h3>
42 <h3>Аналитические</h3>
43 <p>В MSSQL функции данной категории производят вычисления стат. значений по группам строк. Аналитические отличаются от агрегатных тем, что первые способны возвращать по несколько строк для каждой группы.</p>
43 <p>В MSSQL функции данной категории производят вычисления стат. значений по группам строк. Аналитические отличаются от агрегатных тем, что первые способны возвращать по несколько строк для каждой группы.</p>
44 <p>Они используются для определения:</p>
44 <p>Они используются для определения:</p>
45 <ul><li>скользящих средних;</li>
45 <ul><li>скользящих средних;</li>
46 <li>доли в процентах;</li>
46 <li>доли в процентах;</li>
47 <li>промежуточных результатов;</li>
47 <li>промежуточных результатов;</li>
48 <li>первых N результатов в группах.</li>
48 <li>первых N результатов в группах.</li>
49 </ul><h3>NEXT VALUE FOR (T-SQL)</h3>
49 </ul><h3>NEXT VALUE FOR (T-SQL)</h3>
50 <p>Она создает номер последовательности из определенного объекта последовательности. Может применяться в хранимых процедурах и триггерах.</p>
50 <p>Она создает номер последовательности из определенного объекта последовательности. Может применяться в хранимых процедурах и триггерах.</p>
51 <p>NEXT VALUE FOR относится к недетерминированным функциям и допускается лишь при правильном определении номера из последовательности, которая формируется.</p>
51 <p>NEXT VALUE FOR относится к недетерминированным функциям и допускается лишь при правильном определении номера из последовательности, которая формируется.</p>
52 <h3>Наборы строк</h3>
52 <h3>Наборы строк</h3>
53 <p>Они отвечают за возврат объектов, которые могут быть применены таким же образом, как в SQL используются ссылки табличные.</p>
53 <p>Они отвечают за возврат объектов, которые могут быть применены таким же образом, как в SQL используются ссылки табличные.</p>
54 <h3>Встроенные скалярные</h3>
54 <h3>Встроенные скалярные</h3>
55 <p>Те функции, которые выполняют обработку и возвращают одиночные значения, называют скалярными. Могут использоваться везде, где только могут допускаться выражения.</p>
55 <p>Те функции, которые выполняют обработку и возвращают одиночные значения, называют скалярными. Могут использоваться везде, где только могут допускаться выражения.</p>
56 <p>Они делятся на следующие категории функций:</p>
56 <p>Они делятся на следующие категории функций:</p>
57 <ul><li>конфигурации - отвечают за возврат данных о действующих конфигурациях;</li>
57 <ul><li>конфигурации - отвечают за возврат данных о действующих конфигурациях;</li>
58 <li>преобразования - поддерживают приведение и преобразовывают данные разных типов;</li>
58 <li>преобразования - поддерживают приведение и преобразовывают данные разных типов;</li>
59 <li>работы с курсорами - отвечают за возврат информации о курсорах;</li>
59 <li>работы с курсорами - отвечают за возврат информации о курсорах;</li>
60 <li>ф-ций и типов данных даты и времени - производят операции над исходящими значениями дата/ время, отвечают за возврат значений строк и чисел, вместе с датой и временем;</li>
60 <li>ф-ций и типов данных даты и времени - производят операции над исходящими значениями дата/ время, отвечают за возврат значений строк и чисел, вместе с датой и временем;</li>
61 <li>JSON - работают с данными JSON (выполняют запросы, проверку, вносят изменения);</li>
61 <li>JSON - работают с данными JSON (выполняют запросы, проверку, вносят изменения);</li>
62 <li>логические - осуществляют логические операции;</li>
62 <li>логические - осуществляют логические операции;</li>
63 <li>математические - производят вычисления, которые основаны на числах, что были переданы в качестве аргументов и возвращают значения в числах;</li>
63 <li>математические - производят вычисления, которые основаны на числах, что были переданы в качестве аргументов и возвращают значения в числах;</li>
64 <li>метаданных - отвечают за возврат данных как о самих базах данных (БД), так и о принадлежащих им объектах;</li>
64 <li>метаданных - отвечают за возврат данных как о самих базах данных (БД), так и о принадлежащих им объектах;</li>
65 <li>безопасности - возвращают информацию о пользователях и какими ролями они наделены;</li>
65 <li>безопасности - возвращают информацию о пользователях и какими ролями они наделены;</li>
66 <li>строковые - выполняют операции со строковыми входными значениями (char либо varchar) и возвращают значения (в виде строк или чисел);</li>
66 <li>строковые - выполняют операции со строковыми входными значениями (char либо varchar) и возвращают значения (в виде строк или чисел);</li>
67 <li>системные - выполняют операции над разными объектами, значениями, параметрами экземпляров SQL Server и возвращают информацию о них;</li>
67 <li>системные - выполняют операции над разными объектами, значениями, параметрами экземпляров SQL Server и возвращают информацию о них;</li>
68 <li>системные статистические - возвращают статистические данные о системе;</li>
68 <li>системные статистические - возвращают статистические данные о системе;</li>
69 <li>обработки текстов и изображений - выполняют различные операции над текстовыми, графическими значениями, столбцами и возвращают данные о них.</li>
69 <li>обработки текстов и изображений - выполняют различные операции над текстовыми, графическими значениями, столбцами и возвращают данные о них.</li>
70 </ul><h3>Оконные</h3>
70 </ul><h3>Оконные</h3>
71 <p>В начале данной функции всегда находится оператор OVER. Настройка осуществляется при участии инструкций PARTITION BY, ORDER BY и ROWS. Их реализация стала возможна начиная со SQL Server 2005.</p>
71 <p>В начале данной функции всегда находится оператор OVER. Настройка осуществляется при участии инструкций PARTITION BY, ORDER BY и ROWS. Их реализация стала возможна начиная со SQL Server 2005.</p>
72 <p>Преимущества их использования:</p>
72 <p>Преимущества их использования:</p>
73 <ul><li>возвращают такое же количество значений, сколько было получено на входе, а не уменьшают число строк;</li>
73 <ul><li>возвращают такое же количество значений, сколько было получено на входе, а не уменьшают число строк;</li>
74 <li>могут обращаться к иным строкам;</li>
74 <li>могут обращаться к иным строкам;</li>
75 <li>вычисляют скользящие средние и кумулятивные суммы;</li>
75 <li>вычисляют скользящие средние и кумулятивные суммы;</li>
76 <li>дают больше свободы по сравнению с использованием оператора JOIN.</li>
76 <li>дают больше свободы по сравнению с использованием оператора JOIN.</li>
77 </ul><h4>Инструкция SELECT - предложение OVER (T-SQL)</h4>
77 </ul><h4>Инструкция SELECT - предложение OVER (T-SQL)</h4>
78 <p>Данная инструкция выступает в качестве определяющей секционирование и урегулирование набора строчек до того, как будет применена соответствующая оконная функция. Так предложение OVER указывает окно либо внутри результирующих наборов Queries - набор строк, который определяет пользователь. После этого оконная функция производит вычисление значений для каждой строчки в окне.</p>
78 <p>Данная инструкция выступает в качестве определяющей секционирование и урегулирование набора строчек до того, как будет применена соответствующая оконная функция. Так предложение OVER указывает окно либо внутри результирующих наборов Queries - набор строк, который определяет пользователь. После этого оконная функция производит вычисление значений для каждой строчки в окне.</p>
79 <p>Можно применяться вместе с функциями для нахождения стат. значений.</p>
79 <p>Можно применяться вместе с функциями для нахождения стат. значений.</p>
80 <h3>Детерминированные и недетерминированные</h3>
80 <h3>Детерминированные и недетерминированные</h3>
81 <p>Все встроенные функции бывают:</p>
81 <p>Все встроенные функции бывают:</p>
82 <ul><li>детерминированные - для входящих значений они постоянно возвращают один и тот же результат;</li>
82 <ul><li>детерминированные - для входящих значений они постоянно возвращают один и тот же результат;</li>
83 <li>недетерминированными - для одних и тех же исходящих значений возвращают разные результаты.</li>
83 <li>недетерминированными - для одних и тех же исходящих значений возвращают разные результаты.</li>
84 </ul><h3>Параметры сортировки</h3>
84 </ul><h3>Параметры сортировки</h3>
85 <p>Параметры сортировки:</p>
85 <p>Параметры сортировки:</p>
86 <ul><li>входных строк для строчек вывода применяют те же SQL функции, которые вводят и выдают символьные строки;</li>
86 <ul><li>входных строк для строчек вывода применяют те же SQL функции, которые вводят и выдают символьные строки;</li>
87 <li>при выводе для текущей БД по умолчанию используют такие ф-ции, которые обрабатывают не символьные исходные данные, а возвращают символьные строчки;</li>
87 <li>при выводе для текущей БД по умолчанию используют такие ф-ции, которые обрабатывают не символьные исходные данные, а возвращают символьные строчки;</li>
88 <li>для строк вывода на основе правил очередности параметров сортировки задают функции, которые в качестве исходных обрабатывают указанное число символьных строк и возвращают символьную строчку.</li>
88 <li>для строк вывода на основе правил очередности параметров сортировки задают функции, которые в качестве исходных обрабатывают указанное число символьных строк и возвращают символьную строчку.</li>
89 </ul><h2>Функции, определяемые пользователем</h2>
89 </ul><h2>Функции, определяемые пользователем</h2>
90 <p>В каждом случае функции возвращают одно значение, чем и отличаются от хранимых процедур. Особый интерес вызывают UDF. Это функции, которые пользователь определяет самостоятельно (UDF - User Defined Functions). В Microsoft SQL предоставленные системой встроенные функции можно расширять, создавая самостоятельно пользовательские - UDF.</p>
90 <p>В каждом случае функции возвращают одно значение, чем и отличаются от хранимых процедур. Особый интерес вызывают UDF. Это функции, которые пользователь определяет самостоятельно (UDF - User Defined Functions). В Microsoft SQL предоставленные системой встроенные функции можно расширять, создавая самостоятельно пользовательские - UDF.</p>
91 <p>Они получают параметры (от 0 и более) и возвращают скалярное значение либо таблицу. Для входящих параметров может использоваться любой тип данных. Исключение составляют timestamp, cursor, table. </p>
91 <p>Они получают параметры (от 0 и более) и возвращают скалярное значение либо таблицу. Для входящих параметров может использоваться любой тип данных. Исключение составляют timestamp, cursor, table. </p>
92 <p>Различают несколько типов UDF:</p>
92 <p>Различают несколько типов UDF:</p>
93 <ul><li>скалярные - аналогичны со скалярными встроенными;</li>
93 <ul><li>скалярные - аналогичны со скалярными встроенными;</li>
94 <li>возвращающие табличное значение - возвращают итог инструкции SELECT;</li>
94 <li>возвращающие табличное значение - возвращают итог инструкции SELECT;</li>
95 <li>мультиоператорные - возвращают T-SQL таблицу, которая создана оператором (одним либо несколькими). Это схоже с хранимыми процедурами, однако отличаются от них тем, что в WHERE можно ссылаться на такие UDF, как на просматриваемый объект.</li>
95 <li>мультиоператорные - возвращают T-SQL таблицу, которая создана оператором (одним либо несколькими). Это схоже с хранимыми процедурами, однако отличаются от них тем, что в WHERE можно ссылаться на такие UDF, как на просматриваемый объект.</li>
96 </ul><h3>Создание и выполнение</h3>
96 </ul><h3>Создание и выполнение</h3>
97 <p>Процесс формирования UDF очень схож с тем, как создаются объекты просмотра и процедур. Они формируются при помощи инструкции CREATE FUNCTION.</p>
97 <p>Процесс формирования UDF очень схож с тем, как создаются объекты просмотра и процедур. Они формируются при помощи инструкции CREATE FUNCTION.</p>
98 <p>UDF может быть использована только пользователями, наделенными ролями sysadmin, db_owner, db_ddladmin. Однако пользователи с перечисленными ролями могут присваивать аналогичные права иным пользователям, воспользовавшись инструкцией GRANT CREATE FUNCTION.</p>
98 <p>UDF может быть использована только пользователями, наделенными ролями sysadmin, db_owner, db_ddladmin. Однако пользователи с перечисленными ролями могут присваивать аналогичные права иным пользователям, воспользовавшись инструкцией GRANT CREATE FUNCTION.</p>
99 <p>Объявления будут отличаться в зависимости от типа хранимой функции.</p>
99 <p>Объявления будут отличаться в зависимости от типа хранимой функции.</p>
100 <h4>Инструкция CREATE FUNCTION</h4>
100 <h4>Инструкция CREATE FUNCTION</h4>
101 <p>Как сказано выше, с помощью CREATE FUNCTION создаются UDF, которые представляют собой подпрограммы среды CLR или T-SQL. CREATE FUNCTION позволяет создавать именно такие подпрограммы.</p>
101 <p>Как сказано выше, с помощью CREATE FUNCTION создаются UDF, которые представляют собой подпрограммы среды CLR или T-SQL. CREATE FUNCTION позволяет создавать именно такие подпрограммы.</p>
102 <p>В дальнейшем подпрограммы, созданные данной инструкцией, могут применяться:</p>
102 <p>В дальнейшем подпрограммы, созданные данной инструкцией, могут применяться:</p>
103 <ul><li>инструкциями Transact-SQL (к примеру, SELECT);</li>
103 <ul><li>инструкциями Transact-SQL (к примеру, SELECT);</li>
104 <li>приложениями, участвующими в вызове функций;</li>
104 <li>приложениями, участвующими в вызове функций;</li>
105 <li>при определении иной UDF;</li>
105 <li>при определении иной UDF;</li>
106 <li>чтобы определить параметры представления либо улучшить функциональные возможности индексированных представлений;</li>
106 <li>чтобы определить параметры представления либо улучшить функциональные возможности индексированных представлений;</li>
107 <li>при определении столбцов таблиц;</li>
107 <li>при определении столбцов таблиц;</li>
108 <li>чтобы определить ограничения на столбец CHECK;</li>
108 <li>чтобы определить ограничения на столбец CHECK;</li>
109 <li>чтобы заменить хранимые процедуры;</li>
109 <li>чтобы заменить хранимые процедуры;</li>
110 <li>для политики безопасности.</li>
110 <li>для политики безопасности.</li>
111 </ul><h3>Скалярные в T-SQL</h3>
111 </ul><h3>Скалярные в T-SQL</h3>
112 <p>После указания инструкции CREATE FUNCTION следует указать имя функции вместе с параметрами, подлежащими передаче. Параметры функции SQL указываются в круглых скобках, путем перечисления и разделения запятыми. Именно это и есть основное отличие от процедур, и его не нужно забывать.</p>
112 <p>После указания инструкции CREATE FUNCTION следует указать имя функции вместе с параметрами, подлежащими передаче. Параметры функции SQL указываются в круглых скобках, путем перечисления и разделения запятыми. Именно это и есть основное отличие от процедур, и его не нужно забывать.</p>
113 <p>Далее следует указать ключевое слово RETURNS вместе с описанием типа значения, подлежащего возврату. Для скалярной функции данный тип может быть любым (строкой, числом, датой), но тоже скалярным.</p>
113 <p>Далее следует указать ключевое слово RETURNS вместе с описанием типа значения, подлежащего возврату. Для скалярной функции данный тип может быть любым (строкой, числом, датой), но тоже скалярным.</p>
114 <p>Код выполняемой функции должен быть вписан внутри блока ключевых слов BEGIN/ END. В середине кода могут указываться любые операторы T-SQL. В этот блок могут быть включены также инструкции: присвоения (к примеру, SET), управления процессом выполнения (WHILE и IF), DECLARE, SELECT.</p>
114 <p>Код выполняемой функции должен быть вписан внутри блока ключевых слов BEGIN/ END. В середине кода могут указываться любые операторы T-SQL. В этот блок могут быть включены также инструкции: присвоения (к примеру, SET), управления процессом выполнения (WHILE и IF), DECLARE, SELECT.</p>
115 <h3>Вызов функций, которые определяют пользователи</h3>
115 <h3>Вызов функций, которые определяют пользователи</h3>
116 <p>UDF могут быть вызваны инструкциями T-SQL: SELECT, UPDATE, INSERT, DELETE.</p>
116 <p>UDF могут быть вызваны инструкциями T-SQL: SELECT, UPDATE, INSERT, DELETE.</p>
117 <p>Для вызова UDF следует указать ее название, на забыв приписать пару круглых скобок. Внутри скобок указывается аргумент (от одного и более), которым может выступать значение либо выражение, передающееся входными параметрами. Они обозначаются вслед за наименованием UDF.</p>
117 <p>Для вызова UDF следует указать ее название, на забыв приписать пару круглых скобок. Внутри скобок указывается аргумент (от одного и более), которым может выступать значение либо выражение, передающееся входными параметрами. Они обозначаются вслед за наименованием UDF.</p>
118 <p>Если при вызове функции для параметров не указаны значения по умолчанию, то для них должны быть предоставлены аргументы, определенные в том же порядке, как и в CREATE FUNCTION. Наименования в инструкциях T-SQL должны задаваться с помощью имен, состоящих из пары слов: function name, schema name и т.д.</p>
118 <p>Если при вызове функции для параметров не указаны значения по умолчанию, то для них должны быть предоставлены аргументы, определенные в том же порядке, как и в CREATE FUNCTION. Наименования в инструкциях T-SQL должны задаваться с помощью имен, состоящих из пары слов: function name, schema name и т.д.</p>
119 <h3>Возвращающие таблицу</h3>
119 <h3>Возвращающие таблицу</h3>
120 <p>Пользователь может создавать функции, для которых результат будет возвращаться в виде таблицы. Они также создаются оператором CREATE FUNCTION. Рядом с ним следует указать наименование функции и круглые скобки, но в них не следует ничего указывать. Если рядом с именем не вписать скобок, то сервер вернет ошибку, а сама функция не будет сформирована.</p>
120 <p>Пользователь может создавать функции, для которых результат будет возвращаться в виде таблицы. Они также создаются оператором CREATE FUNCTION. Рядом с ним следует указать наименование функции и круглые скобки, но в них не следует ничего указывать. Если рядом с именем не вписать скобок, то сервер вернет ошибку, а сама функция не будет сформирована.</p>
121 <p>Если в операторе RETURNS будет указано, что данные имеют тип TABLE, то значит функция должна будет вернуть таблицу. Также должны присутствовать ключевые слова AS и RETURN с указанием значения, которое будет возвращено. Внутри RETURN в круглых скобках должен быть указан запрос, итог которого и будет возвращен.</p>
121 <p>Если в операторе RETURNS будет указано, что данные имеют тип TABLE, то значит функция должна будет вернуть таблицу. Также должны присутствовать ключевые слова AS и RETURN с указанием значения, которое будет возвращено. Внутри RETURN в круглых скобках должен быть указан запрос, итог которого и будет возвращен.</p>
122 <p>Их классификация зависит от способа, определяющего тело UDF. Они могут быть:</p>
122 <p>Их классификация зависит от способа, определяющего тело UDF. Они могут быть:</p>
123 <ul><li>inline - встраиваемые, где рядом с TABLE внутри предложения RETURNS отсутствует сопровождающий список столбцов. Оператором SELECT будет возвращен результирующий набор в виде значения с типом данных TABLE;</li>
123 <ul><li>inline - встраиваемые, где рядом с TABLE внутри предложения RETURNS отсутствует сопровождающий список столбцов. Оператором SELECT будет возвращен результирующий набор в виде значения с типом данных TABLE;</li>
124 <li>multistatement - многоинструкционные, они включают наименование переменной и ключевое слово TABLE, определяющее тип данных. Указанные строки будут вставлены в переменную, которая выступает возвращаемым значением самой функции.</li>
124 <li>multistatement - многоинструкционные, они включают наименование переменной и ключевое слово TABLE, определяющее тип данных. Указанные строки будут вставлены в переменную, которая выступает возвращаемым значением самой функции.</li>
125 </ul><p>При написании запросов, во всех его полях необходимо указывать имя. Отсутствие имени хотя бы в одном поле спровоцирует возврат ошибки, когда будет выполняться инструкция CREATE FUNCTION.</p>
125 </ul><p>При написании запросов, во всех его полях необходимо указывать имя. Отсутствие имени хотя бы в одном поле спровоцирует возврат ошибки, когда будет выполняться инструкция CREATE FUNCTION.</p>
126 <h4>Инструкция APPLY</h4>
126 <h4>Инструкция APPLY</h4>
127 <p>Данная инструкция является реляционной. Ее применение вызовет UDF, возвращающее таблицу для всех строчек табличного выражения.</p>
127 <p>Данная инструкция является реляционной. Ее применение вызовет UDF, возвращающее таблицу для всех строчек табличного выражения.</p>
128 <p>APPLY задают в предложении FROM внутри инструкции SELECT. Ее можно объединять с табличной функцией, чтобы получить результат, схожий с результирующим набором операции объединения двух таблиц.</p>
128 <p>APPLY задают в предложении FROM внутри инструкции SELECT. Ее можно объединять с табличной функцией, чтобы получить результат, схожий с результирующим набором операции объединения двух таблиц.</p>
129 <p>Инструкция APPLY имеет две формы:</p>
129 <p>Инструкция APPLY имеет две формы:</p>
130 <ul><li>CROSS APPLY - возвращает строки из внутреннего выражения таблицы (левого), совпадающие с внешним выражением таблицы (правым). Данная форма логически работает аналогично инструкции INNER JOIN;</li>
130 <ul><li>CROSS APPLY - возвращает строки из внутреннего выражения таблицы (левого), совпадающие с внешним выражением таблицы (правым). Данная форма логически работает аналогично инструкции INNER JOIN;</li>
131 <li>OUTER APPLY - возвращает все строки из внутреннего выражения таблицы (левого). В том случае, когда строчки не имеют совпадений во внешнем выражении таблицы, тогда в столбцах внешнего выражения таблицы они содержат NULL. Данная форма логически работает аналогично инструкции LEFT OUTER JOIN.</li>
131 <li>OUTER APPLY - возвращает все строки из внутреннего выражения таблицы (левого). В том случае, когда строчки не имеют совпадений во внешнем выражении таблицы, тогда в столбцах внешнего выражения таблицы они содержат NULL. Данная форма логически работает аналогично инструкции LEFT OUTER JOIN.</li>
132 </ul><h3>Опции</h3>
132 </ul><h3>Опции</h3>
133 <p>В процессе создания UDF можно использовать одну или обе опции:</p>
133 <p>В процессе создания UDF можно использовать одну или обе опции:</p>
134 <ul><li>SCHEMABINDING - привязки к схеме. Объекты БД, на которые ссылается функция, созданная с данной опцией, не могут изменяться (с помощью ALTER) или удаляться (оператором DROP);</li>
134 <ul><li>SCHEMABINDING - привязки к схеме. Объекты БД, на которые ссылается функция, созданная с данной опцией, не могут изменяться (с помощью ALTER) или удаляться (оператором DROP);</li>
135 <li>ENCRYPTION - шифрования текста функции внутри системных таблиц.</li>
135 <li>ENCRYPTION - шифрования текста функции внутри системных таблиц.</li>
136 </ul><p>Допускается, что UDF может быть связана со схемой, только при выполнении условий:</p>
136 </ul><p>Допускается, что UDF может быть связана со схемой, только при выполнении условий:</p>
137 <ul><li>все функции, которые указаны пользователем и объекты просмотра, на которые они ссылаются, связаны со схемой через опцию SCHEMABINDING;</li>
137 <ul><li>все функции, которые указаны пользователем и объекты просмотра, на которые они ссылаются, связаны со схемой через опцию SCHEMABINDING;</li>
138 <li>объекты, на которые ссылается функция, используют имена, состоящие из двух частей;</li>
138 <li>объекты, на которые ссылается функция, используют имена, состоящие из двух частей;</li>
139 <li>объекты, как и сами функции располагаются в одной БД;</li>
139 <li>объекты, как и сами функции располагаются в одной БД;</li>
140 <li>пользователь, создающий функцию, наделен правами доступа к объектам, на которые она ссылается.</li>
140 <li>пользователь, создающий функцию, наделен правами доступа к объектам, на которые она ссылается.</li>
141 </ul><h3>Параметры, возвращающие таблицу</h3>
141 </ul><h3>Параметры, возвращающие таблицу</h3>
142 <p>В более ранних версиях MS SQL Server, существовавших до SQL Server 2008 значительные сложности вызывала задача передачи множественных параметров подпрограмме. Необходимо было проделать ряд действий: создать временную таблицу, после чего вставить в нее передаваемые показатели. И лишь после этого могла быть вызвана подпрограмма.</p>
142 <p>В более ранних версиях MS SQL Server, существовавших до SQL Server 2008 значительные сложности вызывала задача передачи множественных параметров подпрограмме. Необходимо было проделать ряд действий: создать временную таблицу, после чего вставить в нее передаваемые показатели. И лишь после этого могла быть вызвана подпрограмма.</p>
143 <p>Версия SQL Server 2008 значительно упростила решение данной задачи. Это стало возможно с появлением параметров, возвращающих таблицу. Их применение позволяет передавать результирующий набор в соответствующую подпрограмму.</p>
143 <p>Версия SQL Server 2008 значительно упростила решение данной задачи. Это стало возможно с появлением параметров, возвращающих таблицу. Их применение позволяет передавать результирующий набор в соответствующую подпрограмму.</p>
144 <p>Применение таких параметров имеет ряд преимуществ:</p>
144 <p>Применение таких параметров имеет ряд преимуществ:</p>
145 <ul><li>становится значительно проще программировать такие подпрограммы;</li>
145 <ul><li>становится значительно проще программировать такие подпрограммы;</li>
146 <li>сокращается число обращений к серверу и, соответственно, ответов от него;</li>
146 <li>сокращается число обращений к серверу и, соответственно, ответов от него;</li>
147 <li>таблица может содержать неограниченное число строк.</li>
147 <li>таблица может содержать неограниченное число строк.</li>
148 </ul><h3>Изменение и удаление UDF</h3>
148 </ul><h3>Изменение и удаление UDF</h3>
149 <p>Инструкция ALTER FUNCTION, поддерживаемая языком T-SQL, изменяет структуру UDF. Ее обычно применяют, чтобы удалить привязку к схеме. Параметры данной инструкции имеют значения, аналогичные одноименным параметрам инструкции CREATE FUNCTION. Для каждого вида UDF используется индивидуальный вид команд изменения.</p>
149 <p>Инструкция ALTER FUNCTION, поддерживаемая языком T-SQL, изменяет структуру UDF. Ее обычно применяют, чтобы удалить привязку к схеме. Параметры данной инструкции имеют значения, аналогичные одноименным параметрам инструкции CREATE FUNCTION. Для каждого вида UDF используется индивидуальный вид команд изменения.</p>
150 <p>Чтобы удалить UDF, необходимо использовать инструкцию DROP FUNCTION. Сделать это могут владельцы либо пользователи, наделенные ролями sysadmin или db_owner.</p>
150 <p>Чтобы удалить UDF, необходимо использовать инструкцию DROP FUNCTION. Сделать это могут владельцы либо пользователи, наделенные ролями sysadmin или db_owner.</p>
151 <p>Как становится понятно, для грамотного оперирования функциями в MS SQL Server, необходимо хорошо изучить не только встроенные, но и понять алгоритмы создания пользовательских. Потому, на изучение данного материала нужно потратить достаточно времени, чтобы разобраться во всех деталях. Будем рады, если статья поможет в этом. При возникновении вопросов - обязательно задавайте их. Удачи в изучении основ MS SQL функций и алгоритмов работы с ними!</p>
151 <p>Как становится понятно, для грамотного оперирования функциями в MS SQL Server, необходимо хорошо изучить не только встроенные, но и понять алгоритмы создания пользовательских. Потому, на изучение данного материала нужно потратить достаточно времени, чтобы разобраться во всех деталях. Будем рады, если статья поможет в этом. При возникновении вопросов - обязательно задавайте их. Удачи в изучении основ MS SQL функций и алгоритмов работы с ними!</p>
152 - <a></a><p>Также приглааем на <a>специальный курс по MS SQL</a>.</p>
152 + <a></a><p>Также приглашаем на <a>специальный курс по MS SQL</a>.</p>
153  
153