Программирование в Microsoft SQL Server 2000

Хранимые процедуры

Разбить на страницы
Показывать лекцию целиком

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

  • выполнять простые хранимые процедуры;
  • выполнять хранимые процедуры с входными параметрами;
  • выполнять хранимые процедуры с именованными параметрами;
  • выполнять хранимые процедуры с использованием ключевого слова DEFAULT;
  • выполнять хранимые процедуры с выходными параметрами;
  • выполнять хранимые процедуры с возвращаемыми значениями;
  • создавать простые хранимые процедуры;
  • создавать хранимые процедуры с входными параметрами;
  • создавать хранимые процедуры со значениями параметра по умолчанию;
  • создавать хранимые процедуры с выходными параметрами;
  • создавать хранимые процедуры с возвращаемыми значениями.
  • Мы рассмотрели SQL-сценарии, представляющие собой пакеты операторов Transact-SQL, хранимые в текстовом файле. SQL Server также поддерживает хранимые процедуры, которые представляют собой пакеты операторов Transact-SQL, сохраняемые сервером. Теперь познакомимся с созданием и использованием хранимых процедур.

    Понятие о хранимых процедурах

    Хранимые процедуры – не единственное средство выполнения операторов Transact-SQL. Мы уже сталкивались с SQL-сценариями и с возможностью передавать команды непосредственно из приложения. Однако хранимые процедуры обладают рядом преимуществ:

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

    SQL-сценарии, с которыми мы работали, выполнялись независимо – у нас не было никакой возможности передать им какую-либо информацию, а единственная информация, которую они возвращали, отображалась в панелях сетки Grid или в панели сообщений Message Pane окна Query (Запрос). Хранимые процедуры предоставляют два метода взаимодействия с внешними процессами: через параметры и через возвращаемые значения.

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

    Возвращаемое значение схоже с результатом выполнения функции и аналогичным образом может быть присвоено локальной переменной. Возвращаемые значения всегда являются целыми числами. Теоретически они могут быть использованы для возврата любого результата, но в соответствии с соглашением они применяются для возврата статуса выполнения хранимой процедуры. Например, хранимая процедура может возвращать 0, если все идет нормально, или -1, если возникла ошибка. Более сложные хранимые процедуры могут возвращать различные значения для указания типа ошибки.

    Важно не путать параметры и возвращаемые коды с какими-либо результирующими множествами, которые может возвращать хранимая процедура. Хранимая процедура может содержать любое количество операторов SELECT, которые будут возвращать результирующие множества. Для их получения вам не нужно использовать параметр; они будут возвращены в программу приложения независимо.

    Системные процедуры

    Хранимые процедуры делятся на две группы: системные процедуры, создаваемые SQL Server, и пользовательские хранимые процедуры, которые вы создаете самостоятельно. Системные хранимые процедуры хранятся в главной базе данных. Все они начинаются с символов sp_.

    Совет. Вы можете создать хранимую процедуру, использовав sp_ в качестве начальной части имени, но лучше этого не делать.

    Поскольку SQL Server всегда ищет хранимые процедуры прежде всего в главной базе данных, если существует системная процедура с таким же именем, ваша хранимая процедура никогда не будет выполнена.

    В главной базе данных около сотни системных процедур. Многие из них предоставляют средства для программного выполнения задач администрирования, рассмотренных нами в части 1. Например, процедура sp_addlogin позволяет вам добавлять идентификатор учетной записи, а процедура sp_add_jobschedule дает возможность составлять расписание заданий, таких как резервное копирование базы данных.

    Примечание. Детальная информация обо всех системных хранимых процедурах содержится в документации SQL Server Books Online.

    Другие системные процедуры помогают вам управлять объектами базы данных. Например, процедура sp_rename дает возможность переименовывать объекты базы данных, а процедура sp_renamedb предоставляет средства для переименования базы данных.

    Совет. Единственным способом переименования базы данных является использование системной процедуры sp_renamedb. Это действие не может быть выполнено в Enterprise Manager.

    Важная группа системных процедур предоставляет информацию о текущем статусе системы: процедура sp_who предоставляет информацию о текущих пользователях и процессах; процедура sp_cursor_list предоставляет список текущих курсоров для данного соединения; процедура sp_helpdb предоставляет список всех текущих баз данных, обслуживаемых сервером, а также сообщает вам физическое местоположение файла данных и журнала транзакций для любой заданной базы данных. Вы также можете воспользоваться процедурой sp_help для получения информации об объектах базы данных. В эту информацию входят: имя, владелец и тип каждого объекта базы данных, сведения о системных и пользовательских типах данных, а также имена и параметры хранимых процедур.

    Пользовательские хранимые процедуры

    Подобно таблицам базы данных, пользовательские хранимые процедуры представляют собой объект, являющийся частью базы данных, в которой он создан, и будет перемещаться вместе с ней. Различие заключается в том, что объекты хранимых процедур содержат не данные, а код Transact-SQL.

    Примечание. SQL Server создает в каждой базе данных несколько хранимых процедур. Все имена этих хранимых процедур начинаются с dt_. Они используются для управления исходными данными, а также при преобразовании данных.

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

    Использование и создание хранимых процедур

    Как и для всех других объектов базы данных, вы должны сначала создать пользовательскую хранимую процедуру, прежде чем сможете ее использовать. Чтобы несколько облегчить понимание, мы рассмотрим эти действия в обратном порядке: сначала мы познакомимся с использованием хранимых процедур, а затем вы создадите свою собственную.

    Использование хранимых процедур

    Для вызова пользовательских и системных хранимых процедур используется оператор EXECUTE. Если хранимая процедура не требует параметров, или если она не возвращает результат, синтаксис ее будет очень простым:

    EXECUTE имя_процедуры

    Совет. Ключевое слово EXECUTE можно не указывать, если вызов хранимой процедуры является первым оператором в пакете. Однако, как и в других подобных случаях, лучше лишний раз подстраховаться. Поэтому заведите привычку всегда использовать ключевое слово EXECUTE или его аббревиатуру EXEC при использовании хранимой процедуры.

    Выполните простую хранимую процедуру

  • Нажмите кнопку New Query (Новый запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer откроет новое окно Query (Запрос).
  • Введите в окне запроса Query следующий оператор:
    EXECUTE sp_helpdb
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
  • Внимание! Поскольку процедура sp_help отображает все базы данных, имеющиеся на текущем сервере, ваша структура может не совпадать с той, которая представлена на рисунке. В вашей панели сетки Grid Pane могут содержаться другие базы данных.

    Если хранимая процедура принимает входные параметры, вы можете предоставить их, указав позицию или имя. Чтобы предоставит параметры по позиции, вам нужно просто указать их после имени хранимой процедуры, отделяя запятыми:

    EXECUTE имя_процедуры параметр [ , параметр ...]

    Использование Object Browser для работы с хранимыми процедурами

    Панель Object Browser содержит папку Stored Procedures для каждой базы данных, включая главную. Каждая хранимая процедура, содержащаяся в списке, имеет папку Parameters. В этой папке в определенном порядке размещаются параметры хранимой процедуры, поэтому вы можете воспользоваться ею для проверки имен параметров и их позиций.

    Для создания сценария EXECUTE для хранимой процедуры вы также можете воспользоваться командами скриптования из контекстного меню. Сценарий EXECUTE в Object Browser создает включения объявлений локальных переменных для возвращаемых значений и выходных параметров.

    Выполните хранимую процедуру с входными параметрами

  • Выберите панель редактирования Editor Pane в окне Query (Запрос) и нажмите кнопку Clear Window (Очистить окно)в панели инструментов анализатора запросов Query Analyzer.
  • Введите следующий оператор в окне Query (Запрос):
    EXECUTE sp_dboption 'Aromatherapy', 'read only'
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результаты.
  • Параметры также могут быть переданы хранимой процедуре путем явного указания их имен. При этом от вас потребуется больше усилий при вводе, но зато вы сможете задать параметры в любом порядке. Синтаксис для вызова хранимой процедуры с указанием именованных параметров следующий:

    EXECUTE хранимая_процедура @имя_парам = значение [, @имя_парам = значение ...]

    Выполните хранимую процедуру с именованными параметрами

  • Выберите панель редактирования Editor Pane в окне Query (Запрос) и нажмите кнопку Clear Window (Очистить окно)в панели инструментов анализатора запросов Query Analyzer.
  • Введите следующий оператор в окне Query (Запрос):
    EXECUTE sp_dboption @optname = 'read only',
    @dbname = 'Aromatherapy'
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результаты.
  • Некоторые хранимые процедуры предоставляют для своих параметров значения по умолчанию. Подобно значениям по умолчанию для столбцов таблицы, параметры по умолчанию используются хранимой процедурой, если пользователь явно не задал значение. Использовать умолчание проще для именованных параметров – вам достаточно не указывать значение для параметра.

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

    Выполните хранимую процедуру с использованием ключевого слова DEFAULT

  • Выберите панель редактирования Editor Pane в окне Query (Запрос) и нажмите кнопку Clear Window (Очистить окно)в панели инструментов анализатора запросов Query Analyzer.
  • Введите следующий оператор в окне Query (Запрос):
    EXECUTE sp_dboption DEFAULT, 'read only'
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результаты.
  • Кроме доступа к переданным им данным, хранимые процедуры могут также возвращать данные обратно через выходные параметры. Выходные параметры должны быть локальными переменными. Они могут быть заданы либо путем указания их имен, либо путем указания их позиций, но при этом после выходного параметра должно следовать ключевое слово OUTPUT.

    Выполните хранимую процедуру с выходными параметрами

  • Выберите панель редактирования Editor Pane в окне Query (Запрос) и нажмите кнопку Clear Window (Очистить окно)в панели инструментов анализатора запросов Query Analyzer.
  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Перейдите к папке SQL 2000 Step by Step в корневой директории, выделите сценарий TableValidation и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит сценарий и отобразит результаты.
  • Синтаксис для хранимой процедуры, возвращающей значения, является неким гибридом оператора EXECUTE и оператора SET:

    EXECUTE @имя_переменной = хранимая_процедура [, парам [, парам ...] ]

    Большинство системных процедур имеют возвращаемые значения, но поскольку они являются параметрами по умолчанию, их можно игнорировать в описании вызова процедуры. Если вы не указали локальную переменную для приема результатов, SQL Server просто отбросит значение.

    Выполните хранимую процедуру с возвращаемым значением

  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Выделите сценарий ReturnValue и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результаты.
  • Выберите вкладку Message (Сообщение). Query Analyzer отобразит результаты выполнения оператора
  • Создание хранимых процедур

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

    CREATE PROCEDURE имя_процедуры
    [список_параметров]
    AS
    операторы_процедуры

    Имя_процедуры должно отвечать правилам, принятым для идентификаторов.

    Совет. Вы можете создать временную локальную или глобальную хранимую процедуру, указав перед именем процедуры # или ## соответственно.

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

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

    Создайте простую хранимую процедуру

  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Выделите сценарий SimpleSP и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
  • Нажмите кнопку New Query (Новый запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).
  • Введите в окне вкладки Editor (Редактор) следующий оператор:
    EXECUTE SimpleSP
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
  • Закройте окно Query (Запрос), не сохраняя изменения при появлении соответствующего окна-запроса.
  • Каждый из параметров в списке_параметров имеет следующую структуру:

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

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

    Значение_по_умолчанию представляет собой значение, которое будет использоваться хранимой процедурой в случае, если пользователь не укажет значение для входного параметра в вызове хранимой процедуры. Ключевое слово OUTPUT, которое также не является обязательным, определяет параметры, которые будут возвращены в вызвавший процедуру сценарий.

    Создайте хранимую процедуру с входным параметром

  • Перейдите к окну, содержащему сценарий SimpleSP.
  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Выделите сценарий InputSP и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
  • Нажмите кнопку New Query (Новый запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).
  • Введите на вкладке Editor (Редактирование) следующий оператор:
    EXECUTE InputSP 'Basil'
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
  • Закройте окно Query (Запрос), отклонив сохранение изменений в появившемся окне-запросе.
  • Создайте хранимую процедуру со значением по умолчанию

  • Перейдите к окну, содержащему сценарий InputSP.
  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Выделите сценарий DefaultSP и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
  • Нажмите кнопку New Query (Новый запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).
  • Введите на вкладке Editor (Редактирование) следующий оператор:
    EXECUTE DefaultSP
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
  • Закройте окно Query (Запрос), отклонив сохранение изменений в появившемся окне-запросе.
  • Создайте хранимую процедуру с выходным параметром

  • Перейдите к окну, содержащему сценарий DefaultSP.
  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Выделите сценарий OutputSP и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
  • Нажмите кнопку New Query (Новый запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).
  • Введите следующие операторы на вкладке Editor (Редактор):
    DECLARE @myOutput char(6)
    EXECUTE OutputSP @myOutput OUTPUT
    SELECT @myOutput
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
  • Закройте окно Query (Запрос), отклонив сохранение изменений в появившемся окне-запросе.
  • Возврат значений реализуется с помощью оператора RETURN, который имеет следующую форму:

    RETURN(int)

    В операторе RETURN int – это целочисленное значение. Как мы видели раньше, возврат значений чаще всего используется для определения статуса выполнения хранимой процедуры. При этом 0 указывает на успешное завершение выполнения, а любое другое число указывает на ошибку. Ошибки могут быть проанализированы с помощью глобальной переменной @@ERROR, которая возвращает статус выполнения последней команды Transact-SQL: 0 указывает на успешное выполнение, а ненулевое значение указывает, что имела место ошибка.

    Совет. Строка сообщения об ошибках SQL Server хранится в главной базе данных в таблице sysmessage. Вы можете добавить свои собственные сообщения об ошибках в эту таблицу, воспользовавшись системной процедурой sp_addmessage, а затем применить функцию RAISERROR для генерирования характерных для базы данных, или даже для приложения, ошибок.

    Создайте хранимую процедуру с возвращаемым значением

  • Перейдите к окну, содержащему сценарий OutputSP.
  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Выделите сценарий ErrorSP и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
  • Нажмите кнопку New Query (Новый запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).
  • Введите следующие операторы на вкладке Editor (Редактор):
    DECLARE @theError int
    EXECUTE @theError = ErrorSP
    SELECT @theError AS 'Return Value'
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты. Во второй панели сетки отображается 0, что указывает на успешное выполнение команды.
  • Закройте окно Query (Запрос), без сохранения изменений.
  • Краткое содержание

    Чтобы ... Синтаксис операторов SQL
    Выполнить простую хранимую процедуру EXECUTE имя_процедуры
    Выполнить хранимую процедуру с входными параметрами EXECUTE имя_процедуры парам [, парам ...]
    Выполнить хранимую процедуру с именованными параметрами EXECUTE хранимая_процедура @имя_парам = значение[, @имя_парам = значение ...]
    Выполнить хранимую процедуру с выходными параметрами Поместите после @имя_парам в операторе EXECUTE ключевое слово OUTPUT
    Выполнить хранимую процедуру с возвращаемым значением EXECUTE @имя_переменной = хранимая_процедура[, парам [, парам ...] ]
    Создать хранимую процедуру CREATE PROCEDURE имя_процедуры AS операторы_процедуры
    Возвратить значение из хранимой процедуры RETURN(возвращаемое_значение)
    Страницы:

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

  • выполнять простые хранимые процедуры;
  • выполнять хранимые процедуры с входными параметрами;
  • выполнять хранимые процедуры с именованными параметрами;
  • выполнять хранимые процедуры с использованием ключевого слова DEFAULT;
  • выполнять хранимые процедуры с выходными параметрами;
  • выполнять хранимые процедуры с возвращаемыми значениями;
  • создавать простые хранимые процедуры;
  • создавать хранимые процедуры с входными параметрами;
  • создавать хранимые процедуры со значениями параметра по умолчанию;
  • создавать хранимые процедуры с выходными параметрами;
  • создавать хранимые процедуры с возвращаемыми значениями.
  • Мы рассмотрели SQL-сценарии, представляющие собой пакеты операторов Transact-SQL, хранимые в текстовом файле. SQL Server также поддерживает хранимые процедуры, которые представляют собой пакеты операторов Transact-SQL, сохраняемые сервером. Теперь познакомимся с созданием и использованием хранимых процедур.

    Понятие о хранимых процедурах

    Хранимые процедуры – не единственное средство выполнения операторов Transact-SQL. Мы уже сталкивались с SQL-сценариями и с возможностью передавать команды непосредственно из приложения. Однако хранимые процедуры обладают рядом преимуществ:

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

    SQL-сценарии, с которыми мы работали, выполнялись независимо – у нас не было никакой возможности передать им какую-либо информацию, а единственная информация, которую они возвращали, отображалась в панелях сетки Grid или в панели сообщений Message Pane окна Query (Запрос). Хранимые процедуры предоставляют два метода взаимодействия с внешними процессами: через параметры и через возвращаемые значения.

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

    Возвращаемое значение схоже с результатом выполнения функции и аналогичным образом может быть присвоено локальной переменной. Возвращаемые значения всегда являются целыми числами. Теоретически они могут быть использованы для возврата любого результата, но в соответствии с соглашением они применяются для возврата статуса выполнения хранимой процедуры. Например, хранимая процедура может возвращать 0, если все идет нормально, или -1, если возникла ошибка. Более сложные хранимые процедуры могут возвращать различные значения для указания типа ошибки.

    Важно не путать параметры и возвращаемые коды с какими-либо результирующими множествами, которые может возвращать хранимая процедура. Хранимая процедура может содержать любое количество операторов SELECT, которые будут возвращать результирующие множества. Для их получения вам не нужно использовать параметр; они будут возвращены в программу приложения независимо.

    Системные процедуры

    Хранимые процедуры делятся на две группы: системные процедуры, создаваемые SQL Server, и пользовательские хранимые процедуры, которые вы создаете самостоятельно. Системные хранимые процедуры хранятся в главной базе данных. Все они начинаются с символов sp_.

    Совет. Вы можете создать хранимую процедуру, использовав sp_ в качестве начальной части имени, но лучше этого не делать.

    Поскольку SQL Server всегда ищет хранимые процедуры прежде всего в главной базе данных, если существует системная процедура с таким же именем, ваша хранимая процедура никогда не будет выполнена.

    В главной базе данных около сотни системных процедур. Многие из них предоставляют средства для программного выполнения задач администрирования, рассмотренных нами в части 1. Например, процедура sp_addlogin позволяет вам добавлять идентификатор учетной записи, а процедура sp_add_jobschedule дает возможность составлять расписание заданий, таких как резервное копирование базы данных.

    Примечание. Детальная информация обо всех системных хранимых процедурах содержится в документации SQL Server Books Online.

    Другие системные процедуры помогают вам управлять объектами базы данных. Например, процедура sp_rename дает возможность переименовывать объекты базы данных, а процедура sp_renamedb предоставляет средства для переименования базы данных.

    Совет. Единственным способом переименования базы данных является использование системной процедуры sp_renamedb. Это действие не может быть выполнено в Enterprise Manager.

    Важная группа системных процедур предоставляет информацию о текущем статусе системы: процедура sp_who предоставляет информацию о текущих пользователях и процессах; процедура sp_cursor_list предоставляет список текущих курсоров для данного соединения; процедура sp_helpdb предоставляет список всех текущих баз данных, обслуживаемых сервером, а также сообщает вам физическое местоположение файла данных и журнала транзакций для любой заданной базы данных. Вы также можете воспользоваться процедурой sp_help для получения информации об объектах базы данных. В эту информацию входят: имя, владелец и тип каждого объекта базы данных, сведения о системных и пользовательских типах данных, а также имена и параметры хранимых процедур.

    Пользовательские хранимые процедуры

    Подобно таблицам базы данных, пользовательские хранимые процедуры представляют собой объект, являющийся частью базы данных, в которой он создан, и будет перемещаться вместе с ней. Различие заключается в том, что объекты хранимых процедур содержат не данные, а код Transact-SQL.

    Примечание. SQL Server создает в каждой базе данных несколько хранимых процедур. Все имена этих хранимых процедур начинаются с dt_. Они используются для управления исходными данными, а также при преобразовании данных.

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

    Использование и создание хранимых процедур

    Как и для всех других объектов базы данных, вы должны сначала создать пользовательскую хранимую процедуру, прежде чем сможете ее использовать. Чтобы несколько облегчить понимание, мы рассмотрим эти действия в обратном порядке: сначала мы познакомимся с использованием хранимых процедур, а затем вы создадите свою собственную.

    Использование хранимых процедур

    Для вызова пользовательских и системных хранимых процедур используется оператор EXECUTE. Если хранимая процедура не требует параметров, или если она не возвращает результат, синтаксис ее будет очень простым:

    EXECUTE имя_процедуры

    Совет. Ключевое слово EXECUTE можно не указывать, если вызов хранимой процедуры является первым оператором в пакете. Однако, как и в других подобных случаях, лучше лишний раз подстраховаться. Поэтому заведите привычку всегда использовать ключевое слово EXECUTE или его аббревиатуру EXEC при использовании хранимой процедуры.

    Выполните простую хранимую процедуру

  • Нажмите кнопку New Query (Новый запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer откроет новое окно Query (Запрос).
  • Введите в окне запроса Query следующий оператор:
    EXECUTE sp_helpdb
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
  • Внимание! Поскольку процедура sp_help отображает все базы данных, имеющиеся на текущем сервере, ваша структура может не совпадать с той, которая представлена на рисунке. В вашей панели сетки Grid Pane могут содержаться другие базы данных.

    Если хранимая процедура принимает входные параметры, вы можете предоставить их, указав позицию или имя. Чтобы предоставит параметры по позиции, вам нужно просто указать их после имени хранимой процедуры, отделяя запятыми:

    EXECUTE имя_процедуры параметр [ , параметр ...]

    Использование Object Browser для работы с хранимыми процедурами

    Панель Object Browser содержит папку Stored Procedures для каждой базы данных, включая главную. Каждая хранимая процедура, содержащаяся в списке, имеет папку Parameters. В этой папке в определенном порядке размещаются параметры хранимой процедуры, поэтому вы можете воспользоваться ею для проверки имен параметров и их позиций.

    Для создания сценария EXECUTE для хранимой процедуры вы также можете воспользоваться командами скриптования из контекстного меню. Сценарий EXECUTE в Object Browser создает включения объявлений локальных переменных для возвращаемых значений и выходных параметров.

    Выполните хранимую процедуру с входными параметрами

  • Выберите панель редактирования Editor Pane в окне Query (Запрос) и нажмите кнопку Clear Window (Очистить окно)в панели инструментов анализатора запросов Query Analyzer.
  • Введите следующий оператор в окне Query (Запрос):
    EXECUTE sp_dboption 'Aromatherapy', 'read only'
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результаты.
  • Параметры также могут быть переданы хранимой процедуре путем явного указания их имен. При этом от вас потребуется больше усилий при вводе, но зато вы сможете задать параметры в любом порядке. Синтаксис для вызова хранимой процедуры с указанием именованных параметров следующий:

    EXECUTE хранимая_процедура @имя_парам = значение [, @имя_парам = значение ...]

    Выполните хранимую процедуру с именованными параметрами

  • Выберите панель редактирования Editor Pane в окне Query (Запрос) и нажмите кнопку Clear Window (Очистить окно)в панели инструментов анализатора запросов Query Analyzer.
  • Введите следующий оператор в окне Query (Запрос):
    EXECUTE sp_dboption @optname = 'read only',
    @dbname = 'Aromatherapy'
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результаты.
  • Некоторые хранимые процедуры предоставляют для своих параметров значения по умолчанию. Подобно значениям по умолчанию для столбцов таблицы, параметры по умолчанию используются хранимой процедурой, если пользователь явно не задал значение. Использовать умолчание проще для именованных параметров – вам достаточно не указывать значение для параметра.

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

    Выполните хранимую процедуру с использованием ключевого слова DEFAULT

  • Выберите панель редактирования Editor Pane в окне Query (Запрос) и нажмите кнопку Clear Window (Очистить окно)в панели инструментов анализатора запросов Query Analyzer.
  • Введите следующий оператор в окне Query (Запрос):
    EXECUTE sp_dboption DEFAULT, 'read only'
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результаты.
  • Кроме доступа к переданным им данным, хранимые процедуры могут также возвращать данные обратно через выходные параметры. Выходные параметры должны быть локальными переменными. Они могут быть заданы либо путем указания их имен, либо путем указания их позиций, но при этом после выходного параметра должно следовать ключевое слово OUTPUT.

    Выполните хранимую процедуру с выходными параметрами

  • Выберите панель редактирования Editor Pane в окне Query (Запрос) и нажмите кнопку Clear Window (Очистить окно)в панели инструментов анализатора запросов Query Analyzer.
  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Перейдите к папке SQL 2000 Step by Step в корневой директории, выделите сценарий TableValidation и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит сценарий и отобразит результаты.
  • Синтаксис для хранимой процедуры, возвращающей значения, является неким гибридом оператора EXECUTE и оператора SET:

    EXECUTE @имя_переменной = хранимая_процедура [, парам [, парам ...] ]

    Большинство системных процедур имеют возвращаемые значения, но поскольку они являются параметрами по умолчанию, их можно игнорировать в описании вызова процедуры. Если вы не указали локальную переменную для приема результатов, SQL Server просто отбросит значение.

    Выполните хранимую процедуру с возвращаемым значением

  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Выделите сценарий ReturnValue и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результаты.
  • Выберите вкладку Message (Сообщение). Query Analyzer отобразит результаты выполнения оператора
  • Создание хранимых процедур

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

    CREATE PROCEDURE имя_процедуры
    [список_параметров]
    AS
    операторы_процедуры

    Имя_процедуры должно отвечать правилам, принятым для идентификаторов.

    Совет. Вы можете создать временную локальную или глобальную хранимую процедуру, указав перед именем процедуры # или ## соответственно.

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

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

    Создайте простую хранимую процедуру

  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Выделите сценарий SimpleSP и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
  • Нажмите кнопку New Query (Новый запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).
  • Введите в окне вкладки Editor (Редактор) следующий оператор:
    EXECUTE SimpleSP
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
  • Закройте окно Query (Запрос), не сохраняя изменения при появлении соответствующего окна-запроса.
  • Каждый из параметров в списке_параметров имеет следующую структуру:

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

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

    Значение_по_умолчанию представляет собой значение, которое будет использоваться хранимой процедурой в случае, если пользователь не укажет значение для входного параметра в вызове хранимой процедуры. Ключевое слово OUTPUT, которое также не является обязательным, определяет параметры, которые будут возвращены в вызвавший процедуру сценарий.

    Создайте хранимую процедуру с входным параметром

  • Перейдите к окну, содержащему сценарий SimpleSP.
  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Выделите сценарий InputSP и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
  • Нажмите кнопку New Query (Новый запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).
  • Введите на вкладке Editor (Редактирование) следующий оператор:
    EXECUTE InputSP 'Basil'
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
  • Закройте окно Query (Запрос), отклонив сохранение изменений в появившемся окне-запросе.
  • Создайте хранимую процедуру со значением по умолчанию

  • Перейдите к окну, содержащему сценарий InputSP.
  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Выделите сценарий DefaultSP и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
  • Нажмите кнопку New Query (Новый запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).
  • Введите на вкладке Editor (Редактирование) следующий оператор:
    EXECUTE DefaultSP
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
  • Закройте окно Query (Запрос), отклонив сохранение изменений в появившемся окне-запросе.
  • Создайте хранимую процедуру с выходным параметром

  • Перейдите к окну, содержащему сценарий DefaultSP.
  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Выделите сценарий OutputSP и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
  • Нажмите кнопку New Query (Новый запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).
  • Введите следующие операторы на вкладке Editor (Редактор):
    DECLARE @myOutput char(6)
    EXECUTE OutputSP @myOutput OUTPUT
    SELECT @myOutput
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
  • Закройте окно Query (Запрос), отклонив сохранение изменений в появившемся окне-запросе.
  • Возврат значений реализуется с помощью оператора RETURN, который имеет следующую форму:

    RETURN(int)

    В операторе RETURN int – это целочисленное значение. Как мы видели раньше, возврат значений чаще всего используется для определения статуса выполнения хранимой процедуры. При этом 0 указывает на успешное завершение выполнения, а любое другое число указывает на ошибку. Ошибки могут быть проанализированы с помощью глобальной переменной @@ERROR, которая возвращает статус выполнения последней команды Transact-SQL: 0 указывает на успешное выполнение, а ненулевое значение указывает, что имела место ошибка.

    Совет. Строка сообщения об ошибках SQL Server хранится в главной базе данных в таблице sysmessage. Вы можете добавить свои собственные сообщения об ошибках в эту таблицу, воспользовавшись системной процедурой sp_addmessage, а затем применить функцию RAISERROR для генерирования характерных для базы данных, или даже для приложения, ошибок.

    Создайте хранимую процедуру с возвращаемым значением

  • Перейдите к окну, содержащему сценарий OutputSP.
  • Нажмите кнопку Load Script (Загрузить сценарий)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
  • Выделите сценарий ErrorSP и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий.
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
  • Нажмите кнопку New Query (Новый запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).
  • Введите следующие операторы на вкладке Editor (Редактор):
    DECLARE @theError int
    EXECUTE @theError = ErrorSP
    SELECT @theError AS 'Return Value'
  • Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты. Во второй панели сетки отображается 0, что указывает на успешное выполнение команды.
  • Закройте окно Query (Запрос), без сохранения изменений.
  • Краткое содержание

    Чтобы ... Синтаксис операторов SQL
    Выполнить простую хранимую процедуру EXECUTE имя_процедуры
    Выполнить хранимую процедуру с входными параметрами EXECUTE имя_процедуры парам [, парам ...]
    Выполнить хранимую процедуру с именованными параметрами EXECUTE хранимая_процедура @имя_парам = значение[, @имя_парам = значение ...]
    Выполнить хранимую процедуру с выходными параметрами Поместите после @имя_парам в операторе EXECUTE ключевое слово OUTPUT
    Выполнить хранимую процедуру с возвращаемым значением EXECUTE @имя_переменной = хранимая_процедура[, парам [, парам ...] ]
    Создать хранимую процедуру CREATE PROCEDURE имя_процедуры AS операторы_процедуры
    Возвратить значение из хранимой процедуры RETURN(возвращаемое_значение)
    Вернуться к учебному плану