Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Создание пользовательских функций




Урок: Пользовательские функции

 

Пользовательские функции – новинка SQL Server 2000. SQL Server позволяет пользователям создавать свои собственные функции. Завершающий урок курса знакомит вас со всеми тонкостями работы с пользовательскими функциями. Приводится огромное количество примеров на языке T-SQL. Рекомендуется использовать систему Books Online, чтобы лучше почувствовать на примерах всю гибкость использования пользовательских функций. Большое количество скриншотов не даст вам запутаться и четко определит последовательность действий. Надеемся, что данный курс помог Вам в вашей учебной или профессиональной деятельности.

Вы научитесь:

  • создавать скалярную функцию;
  • создавать подставляемую табличную функцию;
  • создавать много-операторную табличную функцию;
  • использовать функции в операторе Transact-SQL;
  • использовать функции в операторе CREATE TABLE.

Пользовательские функции являются новинкой SQL Server 2000. Пользовательские функции схожи с хранимыми процедурами тем, что они принимают входные параметры и возвращают результат. Однако пользовательские функции обладают более мощными возможностями по сравнению с хранимыми процедурами и могут использоваться там, где применение хранимых процедур невозможно, например, в определении таблиц и внутри фразы FROM оператора SELECT.

Понятие о пользовательских функциях

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

Функция является детерминированной, если при одном и том же заданном входном значении она всегда возвращает один и тот же результат. Так, встроенная функция DATEADD является детерминированной – добавление трех дней к дате 20 апреля 1958 г. всегда дает дату 23 апреля 1958 г.

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

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

Недетерминированные функции не могут быть использованы для создания индексов или вычисляемых столбцов. Кластерные индексы не могут быть созданы для представления, если представление обращается к какой-либо недетерминированной функции (независимо от того, используется ли она в индексе, или нет).

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

Скалярные пользовательские функции возвращают скалярный (однозначный) результат, такой как строка или число. На типы данных, возвращаемых скалярной функцией, накладывается несколько ограничений. Запрещается использовать нескалярные типы, такие как курсоры и таблицы. Кроме того, скалярные функции не могут возвращать значения с типом timestamp, text, ntext или image, а также значения, имеющие тип данных, определенный пользователем, даже если базовый тип при этом является скаляром.

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

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

Табличные пользовательские функции возвращают таблицу и не заменяют хранимые процедуры или представления, но в определенных ситуациях они могут предоставить более широкие возможности, которые трудно реализовать с помощью этих объектов.

Так, таблица Oils в базе данных Aromatherapy является полностью нормализованной, поэтому более подробная информация, относящаяся к полям PlantParts и Cautions, хранится в других таблицах. Для среднего пользователя все это не имеет особого смысла, и большинству людей трудно будет воспринимать оператор SELECT, осуществляющий полную денормализацию строки в таблице Oils.

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

Возьмем пользовательскую функцию с именем GetOilDetails, которая принимает название ароматического масла и возвращает более подробную информацию о нем. Ваш клиент может использовать следующий оператор Transact-SQL для получения в качестве результата полностью денормализованной информации о масле:

SELECT * FROM GetOilDetails('Basil')   

Подобная возможность дает существенное преимущество, связанное с упрощением клиентского программного обеспечения.

Создание пользовательских функций

Как и другие объекты базы данных, пользовательские функции создаются с помощью соответствующей разновидности команды CREATE. Синтаксис ее может варьироваться в зависимости от вида создаваемой пользовательской функции.

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

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

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

Создание скалярной функции

Оператор CREATE для скалярных пользовательских функций имеет достаточно простой синтаксис для функций всех типов:

CREATE FUNCTION имя_функции ([список_параметров])RETURNS тип_данныхASBEGIN [операторы_tsql] RETURN (возвращаемое_значение)END   

Имя_функции должно удовлетворять правилам, действующим для идентификаторов. Хотя список_параметров в описании оператора CREATE занимает иное место, чем список параметров для хранимой процедуры, они имеют аналогичный синтаксис:

@имя_параметра тип_данных [= значение_по_умолчанию]   

Имя_параметра должно соответствовать правилам, принятым для идентификаторов, и начинаться с символа @. Пользовательские функции могут иметь до 1024 входных параметров. Выходные параметры пользовательские функции не поддерживают – единственным значением, возвращаемым функцией, является результат ее выполнения. Заметим, что список_параметров является необязательным, но наличие скобок обязательно.

Фраза RETURNS определяет тип возвращаемых функцией значений. Скалярные функции могут возвращать любые скалярные системные типы данных, за исключением timestamp, text, ntext или image.

Операторы BEGIN...END, которыми ограничиваются операторы_tsql, составляющие тело функции, являются обязательными, даже если тело функции состоит из одного оператора RETURN.

Создайте скалярную функцию

  1. Нажмите кнопку New Query (Новый запрос) в панели инструментов анализатора запросов Query Analyzer. Query Analyzer откроет новое окно Query (Запрос).
  2. Нажмите кнопку Load Script (Загрузить сценарий) в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

 

  1. Перейдите к папке SQL 2000 Step by Step в корневой директории, выделите сценарий scalarFunction и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.

 

  1. Нажмите кнопку Execute Query (Выполнить запрос) в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст пользовательскую функцию
  2. Раскройте папку Functions базы данных Aromatherapy в панели Object Browser и нажмите клавишу F5, чтобы обновить содержимое окна. В списке в панели Object Browser будет отображена функция dbo.scalarFunction.


увеличить изображение

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


Создание табличных функций

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

Синтаксис для подставляемой табличной функции является усеченной разновидностью оператора CREATE FUNCTION. Блок BEGIN...END отсутствует, и нет никаких других операторов, кроме RETURN:










Последнее изменение этой страницы: 2018-04-11; просмотров: 665.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...