При реализации на языке SQL сложных алгоритмов, которые могут потребоваться более одного раза, сразу встает вопрос о сохранении разработанного кода для дальнейшего применения. Эту задачу можно было бы реализовать с помощью
Возможность создания
В SQL Server имеются следующие классы
BEGIN...END; SELECT и возвращают пользователю набор данных в виде значения INSERT, UPDATE и т.д.). Именно с их помощью и формируется набор данных, который должен быть возвращен после выполнения SELECT, а
Создание и изменение
<определение_скаляр_функции>::=
{CREATE | ALTER } FUNCTION [владелец.]
имя_функции
( [ { @имя_параметра скаляр_тип_данных
[=default]}[,...n]])
RETURNS скаляр_тип_данных
[WITH {ENCRYPTION | SCHEMABINDING}
[,...n] ]
[AS]
BEGIN
<тело_функции>
RETURN скаляр_выражение
END
Рассмотрим назначение параметров команды.
@ ". После имени указывается тип данных параметра. Дополнительно можно указать значение, которое будет автоматически присваиваться параметру ( DEFAULT ), если пользователь явно не указал значение соответствующего параметра при вызове
С помощью конструкции RETURNS скаляр_тип_данных указывается, какой тип данных будет иметь возвращаемое
Дополнительные параметры, с которыми должна быть создана WITH. Благодаря ключевому слову ENCRYPTION код команды, используемый для создания SCHEMABINDING.
Между ключевыми словами BEGIN...END указывается набор команд, они и будут являться телом
Когда в ходе выполнения кода RETURN, выполнение RETURN. Отметим, что в теле RETURN, которые могут возвращать различные значения. В качестве возвращаемого значения допускаются как обычные константы, так и сложные выражения. Единственное условие – тип данных возвращаемого значения должен совпадать с типом данных, указанным после ключевого слова RETURNS.
Пример 11.1. Создать и применить функцию user1.
CREATE FUNCTION
user1.sales(@data DATETIME)
RETURNS INT
AS
BEGIN
DECLARE @c INT
SET @c=(SELECT SUM(количество)
FROM Сделка
WHERE дата=@data)
RETURN (@c)
END
В качестве SELECT путем суммирования количества товара из таблицы Сделка. Условием отбора записей для суммирования является равенство даты сделки значению
Проиллюстрируем обращение к
DECLARE @kol INT
SET @kol=user1.sales ('02.11.01')
SELECT @kol
Создание и изменение
<определение_табл_функции>::=
{CREATE | ALTER } FUNCTION [владелец.]
имя_функции
( [ { @имя_параметра скаляр_тип_данных
[=default]}[,...n]])
RETURNS TABLE
[ WITH {ENCRYPTION | SCHEMABINDING}
[,...n] ]
[AS]
RETURN [(] SELECT_оператор [)]
Основная часть параметров, используемых при создании
После ключевого слова RETURNS всегда должно указываться ключевое слово TABLE. Таким образом, TABLE структуру, возвращаемую запросом SELECT, который является единственной командой
Особенность TABLE создается автоматически в ходе выполнения запроса, а не указывается явно при определении типа после ключевого слова RETURNS.
Возвращаемое FROM.
Пример 11.2. Создать и применить функцию табличного типа для определения двух наименований товара с наибольшим остатком.
CREATE FUNCTION user1.itog() RETURNS TABLE AS RETURN (SELECT TOP 2 Товар.Название FROM Товар INNER JOIN Склад ON Товар.КодТовара=Склад.КодТовара ORDER BY Склад.Остаток DESC)
Использовать
SELECT Название FROM user1.itog()
Создание и изменение
<определение_мульти_функции>::=
{CREATE | ALTER }FUNCTION [владелец.]
имя_функции
( [ { @имя_параметра скаляр_тип_данных
[=default]}[,...n]])
RETURNS @имя_параметра TABLE
<определение_таблицы>
[WITH {ENCRYPTION | SCHEMABINDING}
[,...n] ]
[AS]
BEGIN
<тело_функции>
RETURN
END
Использование большей части параметров рассматривалось при описании предыдущих
Отметим, что TABLE и, таким образом, является частью определения возвращаемого типа данных. Синтаксис конструкции <определение_таблицы> полностью соответствует одноименным структурам, используемым при создании обычных таблиц с помощью команды CREATE TABLE.
Набор возвращаемых данных должен формироваться с помощью команд INSERT, выполняемых в теле INSERT требуется явно указать имя того объекта, куда необходимо вставить строки. Поэтому в
Завершение работы RETURN. В отличие от RETURN не нужно указывать возвращаемое значение. Сервер автоматически возвратит набор данных RETURNS. В теле RETURN.
Необходимо отметить, что работа RETURN. Это утверждение верно и в том случае, когда речь идет о достижении конца тела RETURN.
Пример 11.3. Создать и применить функцию (типа multi-statement), которая для некоторого сотрудника выводит список всех его подчиненных (подчиненных как непосредственно ему, так и опосредствованно через других сотрудников).
Список сотрудников с указанием каждого руководителя представлен в таблице emp_mgr со следующей структурой:
CREATE TABLE emp_mgr (emp CHAR(2) PRIMARY KEY,-- сотрудник mgr CHAR(2)) -- руководитель
Пример данных в таблице emp_mgr показан ниже. Для упрощения иллюстрации имена сотрудников и их начальников представлены буквами латинского алфавита. У директора организации начальника нет ( NULL ).
emp mgr
---------
a NULL
b a
c a
d a
e f
f b
g b
i c
k d
CREATE FUNCTION fn_findReports(@id_emp
CHAR(2))
RETURNS @report TABLE(empid CHAR(2)
PRIMARY KEY,
mgrid CHAR(2))
AS
BEGIN
DECLARE @r INT
DECLARE @t TABLE(empid CHAR(2)
PRIMARY KEY,
mgrid CHAR(2),
pr INT DEFAULT 0)
INSERT @t SELECT emp,mgr,0
FROM emp_mgr
WHERE emp=@id_emp
SET @r=@@ROWCOUNT
WHILE @r>0
BEGIN
UPDATE @t SET pr=1 WHERE pr=0
INSERT @t SELECT e.emp, e.mgr,0
FROM emp_mgr e, @t t
WHERE e.mgr=t.empid
AND t.pr=1
SET @r=@@ROWCOUNT
UPDATE @t SET pr=2 WHERE pr=1
END
INSERT @report SELECT empid, mgrid
FROM @t
RETURN
END
Применим созданную ‘b’:
SELECT * FROM fn_findReports('b')
Оператор возвращает следующие значения:
emp mgr ----------- b a e f f b g b
Список подчиненных сотрудника ‘a’ создается с помощью оператора
SELECT * FROM fn_findReports('a')
emp mgr
---------
a NULL
b a
c a
d a
e f
f b
g b
i c
k d
Другой оператор формирует список подчиненных сотрудника ‘e’:
SELECT * FROM fn_findReports('e')
emp mgr
--------
e f
Список подчиненных сотрудника ‘c’ создает следующий оператор:
SELECT * FROM fn_findReports('c')
emp mgr
--------
c a
i c
Удаление любой
DROP FUNCTION {[ владелец.] имя_функции }
[,...n]
Краткий обзор
ABS |
вычисляет абсолютное значение числа |
ACOS |
вычисляет арккосинус |
ASIN |
вычисляет арксинус |
ATAN |
вычисляет арктангенс |
ATN2 |
вычисляет арктангенс с учетом квадратов |
CEILING |
выполняет округление вверх |
COS |
вычисляет косинус угла |
|
возвращает котангенс угла |
DEGREES |
преобразует значение угла из радиан в градусы |
EXP |
возвращает экспоненту |
FLOOR |
выполняет округление вниз |
LOG |
вычисляет натуральный логарифм |
LOG10 |
вычисляет десятичный логарифм |
PI |
возвращает значение "пи" |
POWER |
возводит число в степень |
|
преобразует значение угла из градуса в радианы |
RAND |
возвращает случайное число |
ROUND |
выполняет округление с заданной точностью |
SIGN |
определяет знак числа |
SIN |
вычисляет синус угла |
SQUARE |
выполняет возведение числа в квадрат |
SQRT |
извлекает квадратный корень |
TAN |
возвращает тангенс угла |
SELECT Товар.Название, Сделка.Количество,
Round(Товар.Цена*Сделка.Количество
*0.05,1)
AS Налог
FROM Товар INNER JOIN Сделка
ON Товар.КодТовара=
Сделка.КодТовара
Краткий обзор
ASCII |
возвращает код ASCII левого символа строки |
CHAR |
по коду ASCII возвращает символ |
CHARINDEX |
определяет порядковый номер символа, с которого начинается вхождение подстроки в строку |
DIFFERENCE |
возвращает показатель совпадения строк |
LEFT |
возвращает указанное число символов с начала строки |
LEN |
возвращает длину строки |
LOWER |
переводит все символы строки в нижний регистр |
LTRIM |
удаляет пробелы в начале строки |
NCHAR |
возвращает по коду символ Unicode |
PATINDEX |
выполняет поиск подстроки в строке по указанному шаблону |
REPLACE |
заменяет вхождения подстроки на указанное значение |
QUOTENAME |
конвертирует строку в формат Unicode |
REPLICATE |
выполняет тиражирование строки определенное число раз |
REVERSE |
возвращает строку, символы которой записаны в обратном порядке |
RIGHT |
возвращает указанное число символов с конца строки |
RTRIM |
удаляет пробелы в конце строки |
|
возвращает код звучания строки |
SPACE |
возвращает указанное число пробелов |
STR |
выполняет конвертирование значения числового типа в символьный формат |
STUFF |
удаляет указанное число символов, заменяя новой подстрокой |
SUBSTRING |
возвращает для строки подстроку указанной длины с заданного символа |
UNICODE |
возвращает Unicode-код левого символа строки |
UPPER |
переводит все символы строки в верхний регистр |
SELECT Фирма, [Фамилия]+""
+Left([Имя],1)+"."
+Left([Отчество],1)
+"." AS ФИО
FROM Клиент
Краткий обзор основных
DATEADD |
добавляет к дате указанное значение дней, месяцев, часов и т.д. |
DATEDIFF |
возвращает разницу между указанными частями двух дат |
DATENAME |
выделяет из даты указанную часть и возвращает ее в символьном формате |
DATEPART |
выделяет из даты указанную часть и возвращает ее в числовом формате |
DAY |
возвращает число из указанной даты |
GETDATE |
возвращает текущее системное время |
ISDATE |
проверяет правильность выражения на соответствие одному из возможных форматов ввода даты |
MONTH |
возвращает значение месяца из указанной даты |
YEAR |
возвращает значение года из указанной даты |
SELECT Year(Дата) AS Год, Month(Дата) AS Месяц, Sum(Количество) AS Общ_Количество FROM Сделка GROUP BY Year(Дата), Month(Дата)
DECLARE @d DATETIME DECLARE @y INT SET @d=’29.10.03’ SET @y=DATEPART(yy,@d) SELECT @y
При реализации на языке SQL сложных алгоритмов, которые могут потребоваться более одного раза, сразу встает вопрос о сохранении разработанного кода для дальнейшего применения. Эту задачу можно было бы реализовать с помощью
Возможность создания
В SQL Server имеются следующие классы
BEGIN...END; SELECT и возвращают пользователю набор данных в виде значения INSERT, UPDATE и т.д.). Именно с их помощью и формируется набор данных, который должен быть возвращен после выполнения SELECT, а
Создание и изменение
<определение_скаляр_функции>::=
{CREATE | ALTER } FUNCTION [владелец.]
имя_функции
( [ { @имя_параметра скаляр_тип_данных
[=default]}[,...n]])
RETURNS скаляр_тип_данных
[WITH {ENCRYPTION | SCHEMABINDING}
[,...n] ]
[AS]
BEGIN
<тело_функции>
RETURN скаляр_выражение
END
Рассмотрим назначение параметров команды.
@ ". После имени указывается тип данных параметра. Дополнительно можно указать значение, которое будет автоматически присваиваться параметру ( DEFAULT ), если пользователь явно не указал значение соответствующего параметра при вызове
С помощью конструкции RETURNS скаляр_тип_данных указывается, какой тип данных будет иметь возвращаемое
Дополнительные параметры, с которыми должна быть создана WITH. Благодаря ключевому слову ENCRYPTION код команды, используемый для создания SCHEMABINDING.
Между ключевыми словами BEGIN...END указывается набор команд, они и будут являться телом
Когда в ходе выполнения кода RETURN, выполнение RETURN. Отметим, что в теле RETURN, которые могут возвращать различные значения. В качестве возвращаемого значения допускаются как обычные константы, так и сложные выражения. Единственное условие – тип данных возвращаемого значения должен совпадать с типом данных, указанным после ключевого слова RETURNS.
Пример 11.1. Создать и применить функцию user1.
CREATE FUNCTION
user1.sales(@data DATETIME)
RETURNS INT
AS
BEGIN
DECLARE @c INT
SET @c=(SELECT SUM(количество)
FROM Сделка
WHERE дата=@data)
RETURN (@c)
END
В качестве SELECT путем суммирования количества товара из таблицы Сделка. Условием отбора записей для суммирования является равенство даты сделки значению
Проиллюстрируем обращение к
DECLARE @kol INT
SET @kol=user1.sales ('02.11.01')
SELECT @kol
Создание и изменение
<определение_табл_функции>::=
{CREATE | ALTER } FUNCTION [владелец.]
имя_функции
( [ { @имя_параметра скаляр_тип_данных
[=default]}[,...n]])
RETURNS TABLE
[ WITH {ENCRYPTION | SCHEMABINDING}
[,...n] ]
[AS]
RETURN [(] SELECT_оператор [)]
Основная часть параметров, используемых при создании
После ключевого слова RETURNS всегда должно указываться ключевое слово TABLE. Таким образом, TABLE структуру, возвращаемую запросом SELECT, который является единственной командой
Особенность TABLE создается автоматически в ходе выполнения запроса, а не указывается явно при определении типа после ключевого слова RETURNS.
Возвращаемое FROM.
Пример 11.2. Создать и применить функцию табличного типа для определения двух наименований товара с наибольшим остатком.
CREATE FUNCTION user1.itog() RETURNS TABLE AS RETURN (SELECT TOP 2 Товар.Название FROM Товар INNER JOIN Склад ON Товар.КодТовара=Склад.КодТовара ORDER BY Склад.Остаток DESC)
Использовать
SELECT Название FROM user1.itog()
Создание и изменение
<определение_мульти_функции>::=
{CREATE | ALTER }FUNCTION [владелец.]
имя_функции
( [ { @имя_параметра скаляр_тип_данных
[=default]}[,...n]])
RETURNS @имя_параметра TABLE
<определение_таблицы>
[WITH {ENCRYPTION | SCHEMABINDING}
[,...n] ]
[AS]
BEGIN
<тело_функции>
RETURN
END
Использование большей части параметров рассматривалось при описании предыдущих
Отметим, что TABLE и, таким образом, является частью определения возвращаемого типа данных. Синтаксис конструкции <определение_таблицы> полностью соответствует одноименным структурам, используемым при создании обычных таблиц с помощью команды CREATE TABLE.
Набор возвращаемых данных должен формироваться с помощью команд INSERT, выполняемых в теле INSERT требуется явно указать имя того объекта, куда необходимо вставить строки. Поэтому в
Завершение работы RETURN. В отличие от RETURN не нужно указывать возвращаемое значение. Сервер автоматически возвратит набор данных RETURNS. В теле RETURN.
Необходимо отметить, что работа RETURN. Это утверждение верно и в том случае, когда речь идет о достижении конца тела RETURN.
Пример 11.3. Создать и применить функцию (типа multi-statement), которая для некоторого сотрудника выводит список всех его подчиненных (подчиненных как непосредственно ему, так и опосредствованно через других сотрудников).
Список сотрудников с указанием каждого руководителя представлен в таблице emp_mgr со следующей структурой:
CREATE TABLE emp_mgr (emp CHAR(2) PRIMARY KEY,-- сотрудник mgr CHAR(2)) -- руководитель
Пример данных в таблице emp_mgr показан ниже. Для упрощения иллюстрации имена сотрудников и их начальников представлены буквами латинского алфавита. У директора организации начальника нет ( NULL ).
emp mgr
---------
a NULL
b a
c a
d a
e f
f b
g b
i c
k d
CREATE FUNCTION fn_findReports(@id_emp
CHAR(2))
RETURNS @report TABLE(empid CHAR(2)
PRIMARY KEY,
mgrid CHAR(2))
AS
BEGIN
DECLARE @r INT
DECLARE @t TABLE(empid CHAR(2)
PRIMARY KEY,
mgrid CHAR(2),
pr INT DEFAULT 0)
INSERT @t SELECT emp,mgr,0
FROM emp_mgr
WHERE emp=@id_emp
SET @r=@@ROWCOUNT
WHILE @r>0
BEGIN
UPDATE @t SET pr=1 WHERE pr=0
INSERT @t SELECT e.emp, e.mgr,0
FROM emp_mgr e, @t t
WHERE e.mgr=t.empid
AND t.pr=1
SET @r=@@ROWCOUNT
UPDATE @t SET pr=2 WHERE pr=1
END
INSERT @report SELECT empid, mgrid
FROM @t
RETURN
END
Применим созданную ‘b’:
SELECT * FROM fn_findReports('b')
Оператор возвращает следующие значения:
emp mgr ----------- b a e f f b g b
Список подчиненных сотрудника ‘a’ создается с помощью оператора
SELECT * FROM fn_findReports('a')
emp mgr
---------
a NULL
b a
c a
d a
e f
f b
g b
i c
k d
Другой оператор формирует список подчиненных сотрудника ‘e’:
SELECT * FROM fn_findReports('e')
emp mgr
--------
e f
Список подчиненных сотрудника ‘c’ создает следующий оператор:
SELECT * FROM fn_findReports('c')
emp mgr
--------
c a
i c
Удаление любой
DROP FUNCTION {[ владелец.] имя_функции }
[,...n]
Краткий обзор
ABS |
вычисляет абсолютное значение числа |
ACOS |
вычисляет арккосинус |
ASIN |
вычисляет арксинус |
ATAN |
вычисляет арктангенс |
ATN2 |
вычисляет арктангенс с учетом квадратов |
CEILING |
выполняет округление вверх |
COS |
вычисляет косинус угла |
|
возвращает котангенс угла |
DEGREES |
преобразует значение угла из радиан в градусы |
EXP |
возвращает экспоненту |
FLOOR |
выполняет округление вниз |
LOG |
вычисляет натуральный логарифм |
LOG10 |
вычисляет десятичный логарифм |
PI |
возвращает значение "пи" |
POWER |
возводит число в степень |
|
преобразует значение угла из градуса в радианы |
RAND |
возвращает случайное число |
ROUND |
выполняет округление с заданной точностью |
SIGN |
определяет знак числа |
SIN |
вычисляет синус угла |
SQUARE |
выполняет возведение числа в квадрат |
SQRT |
извлекает квадратный корень |
TAN |
возвращает тангенс угла |
SELECT Товар.Название, Сделка.Количество,
Round(Товар.Цена*Сделка.Количество
*0.05,1)
AS Налог
FROM Товар INNER JOIN Сделка
ON Товар.КодТовара=
Сделка.КодТовара
Краткий обзор
ASCII |
возвращает код ASCII левого символа строки |
CHAR |
по коду ASCII возвращает символ |
CHARINDEX |
определяет порядковый номер символа, с которого начинается вхождение подстроки в строку |
DIFFERENCE |
возвращает показатель совпадения строк |
LEFT |
возвращает указанное число символов с начала строки |
LEN |
возвращает длину строки |
LOWER |
переводит все символы строки в нижний регистр |
LTRIM |
удаляет пробелы в начале строки |
NCHAR |
возвращает по коду символ Unicode |
PATINDEX |
выполняет поиск подстроки в строке по указанному шаблону |
REPLACE |
заменяет вхождения подстроки на указанное значение |
QUOTENAME |
конвертирует строку в формат Unicode |
REPLICATE |
выполняет тиражирование строки определенное число раз |
REVERSE |
возвращает строку, символы которой записаны в обратном порядке |
RIGHT |
возвращает указанное число символов с конца строки |
RTRIM |
удаляет пробелы в конце строки |
|
возвращает код звучания строки |
SPACE |
возвращает указанное число пробелов |
STR |
выполняет конвертирование значения числового типа в символьный формат |
STUFF |
удаляет указанное число символов, заменяя новой подстрокой |
SUBSTRING |
возвращает для строки подстроку указанной длины с заданного символа |
UNICODE |
возвращает Unicode-код левого символа строки |
UPPER |
переводит все символы строки в верхний регистр |
SELECT Фирма, [Фамилия]+""
+Left([Имя],1)+"."
+Left([Отчество],1)
+"." AS ФИО
FROM Клиент
Краткий обзор основных
DATEADD |
добавляет к дате указанное значение дней, месяцев, часов и т.д. |
DATEDIFF |
возвращает разницу между указанными частями двух дат |
DATENAME |
выделяет из даты указанную часть и возвращает ее в символьном формате |
DATEPART |
выделяет из даты указанную часть и возвращает ее в числовом формате |
DAY |
возвращает число из указанной даты |
GETDATE |
возвращает текущее системное время |
ISDATE |
проверяет правильность выражения на соответствие одному из возможных форматов ввода даты |
MONTH |
возвращает значение месяца из указанной даты |
YEAR |
возвращает значение года из указанной даты |
SELECT Year(Дата) AS Год, Month(Дата) AS Месяц, Sum(Количество) AS Общ_Количество FROM Сделка GROUP BY Year(Дата), Month(Дата)
DECLARE @d DATETIME DECLARE @y INT SET @d=’29.10.03’ SET @y=DATEPART(yy,@d) SELECT @y
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.