Автор работы: Пользователь скрыл имя, 17 Декабря 2012 в 22:18, лабораторная работа
Подавляющую массу задач администрирования SQL Server можно выполнить в графической утилите SQL Server Management Studio. В ней можно создавать базы данных и все ассоциированные с ними объекты (таблицы, представления, хранимые процедуры и др.). Здесь вы можете выполнить последовательности инструкций Transact-SQL (запросы). В этой утилите можно выполнить типовые задачи обслуживания баз данных, такие как резервирование и восстановление. Здесь можно настраивать систему безопасности базы данных и сервера, просматривать журнал ошибок и многое другое.
В следующих трех примерах продемонстрированы вызовы хранимых процедур и передача им параметров с использованием исходного порядка и имен:
EXEC spr_getOrders '01.01.2010', '01.07.2010'
EXEC spr_getOrders
@dateBegin = '01.01.2010',
@dateEnd = '01.07.2010'
EXEC spr_getOrders '01.01.2010', @dateEnd = '01.07.2010'
В объявлении хранимой процедуры для двух указанных параметров не были предусмотрены значения, применяемые по умолчанию, поэтому оба параметра рассматриваются как обязательные. Это означает, что для успешного вызова хранимой процедуры необходимо предоставить оба параметра. В этом можно легко убедиться, осуществив попытку снова вызвать хранимую процедуру, указав только один параметр или вообще не указывая параметры.
Применение выходных параметров
Выходные параметры позволяют хранимой процедуре возвращать данные вызывающей программе. Для определения выходных параметров используется ключевое слово OUT[PUT], которое обязательно как при определении процедуры, так и при ее вызове. В самой хранимой процедуре выходные параметры являются локальными переменными. В вызывающей процедуре или пакете выходные переменные должны быть предварительно определены, чтобы получить результирующие значения. Когда выполнение хранимой процедуры завершается, текущее значение параметра передастся локальной переменной вызывающей программы.
В следующем примере выходной параметр используется для возвращения уникального идентификатора вновь добавленного товара.
CREATE PROCEDURE spr_addProduct
@Description nvarchar(100),
@InStock int = 0,
@IdProd int OUT
AS
INSERT Product([Description], InStock)
VALUES (@Description, @InStock)
SET @IdProd = @@IDENTITY
RETURN
Пример вызова:
DECLARE @IdProd int
EXEC spr_addProduct
@Description = N'Новый товар',
@IdProd = @IdProd OUTPUT
SELECT @IdProd as N'@IdProd'
Обратите внимание на то, что при вызове процедуры переданы значения не для всех параметров. Параметр InStock являются необязательным, поскольку для него указано значение по умолчанию в виде нуля, которое и будет использовано, в случае если для него не будет явно предоставлено другое значение. При этом если бы вызов хранимой процедуры и передача значений происходили с использованием позиционных параметров, то пришлось бы заполнять каждую позицию в списке параметров, по меньшей мере, до того, как встретился бы последний параметр, для которого должно быть предусмотрено значение.
Подтверждение успешного или неудачного завершения работы с помощью возвращаемых значений. Использование команды RETURN.
Любая вызываемая на выполнение хранимая процедура возвращает значение, независимо от того, предусмотрен ли в ней возврат значения или нет. По умолчанию после успешного завершения процедуры СУБД SQL Server автоматически возвращает значение, равное нулю.
Чтобы передать некоторое возвращаемое значение из хранимой процедуры обратно в вызывающий код, достаточно применить оператор RETURN:
RETURN [<Целое число>]
Обратите внимание на то, что возвращаемое значение должно быть обязательно целочисленным.
Возвращаемые
значения предназначены исключительно
для указания на успешное или неудачное
завершение хранимой процедуры и
позволяют даже обозначить степень
или характер успеха или неудачи.
Использование возвращаемого
Одной из наиболее важных особенностей оператора RETURN является то, что его выполнение приводит к безусловному завершению работы и выходу из хранимой процедуры. Это означает, что, независимо от местонахождения оператора RETURN в коде хранимой процедуре, после его выполнения больше не будет выполнена ни одна строка кода. Под безусловным завершением работы подразумевается, что действие, предусмотренное оператором RETURN, осуществляется независимо от того, в каком месте кода он обнаруживается. С другой стороны, допускается наличие в коде хранимой процедуры нескольких операторов RETURN, а выполнение этих операторов происходит, только если к этому приводит обычная структура управления процессом выполнения кода.
В предыдущем примере при попытке добавления в таблицу Product информации о новом товаре с дублирующим названием могла произойти ошибка, поскольку по наименованию товара организовано ограничение уникальности. Расширим хранимую процедуру spr_addProduct, предусмотрев предварительную проверку на наличие указанного товара в базе и индикацию об успешности операции через выходной параметр.
ALTER PROCEDURE [dbo].[spr_addProduct]
@Description nvarchar(100),
@InStock int = 0,
@IdProd int OUT
AS
IF EXISTS(SELECT * FROM Product WHERE [Description] = @Description)
RETURN -100
INSERT Product([Description], InStock)
VALUES (@Description, @InStock)
SET @IdProd = @@IDENTITY
RETURN 0
При вызове хранимой процедуры, если ожидается выходное значение, команда EXEC должна использовать целочисленную переменную:
EXEC @локальная_переменная = имя_хранимой_процедуры;
DECLARE @return_value int,
@IdProd int
EXEC @return_value = spr_addProduct
@Description = N'Новый товар',
@IdProd = @IdProd OUTPUT
IF @return_value = 0
BEGIN
PRINT 'Товар успешно добавлен'
SELECT @IdProd as N'@IdProd'
END
ELSE
BEGIN
PRINT 'При добавлении товара произошла ошибка'
SELECT 'Return Value' = @return_value
END
Задание для самостоятельной работы: Создайте хранимые процедуры, реализующие следующие действия:
Лабораторная работа №9: Функции
Системные функции
SQL Server содержит богатый набор встроенных системных функций, которые формально подразделяются на следующие группы: статистические, функции настройки, функции работы с курсором, функции даты и времени, математические, функции работы с наборами строк, функции безопасности, строковые, системные статистические, функции обработки текста и изображений и прочие. Полный список системных функций, сгруппированных в отдельные папки по вышеуказанным категориям, можно увидеть в Management Studio в узле «Программирование - Функции - Системные функции» дерева обозревателя объектов. Рассмотрим некоторые из наиболее часто используемых скалярных (возвращающих одно значение) встроенных системных функций.
Информационные функции
В архитектуре "клиент/сервер" полезно знать, кем является конкретный клиент. В этом смысле очень полезными окажутся следующие четыре функции, особенно при сборе информации для аудита.
Пример использования:
SELECT
USER_NAME() AS 'Имя пользователя БД',
SUSER_SNAME() AS 'Имя входа',
HOST_NAME() AS 'Имя рабочей станции',
APP_NAME() AS 'Имя приложения'
Строковые функции
SQL Server поддерживает больше двух десятков функций для манипулирования строками. Рассмотрим несколько самых полезных из них.
Функции работы с датой и временем
Для манипулирования значениями даты и времени SQL Server предлагает девять функций. Некоторые из этих функций используют аргумент datepart, определяющий фрагмент, к которому применяется операция. В следующей таблице перечислены все возможные значения аргумента datepart.
Константа |
Значение |
yy или yyyy |
Год |
qq или q |
Квартал |
mm или m |
Месяц |
wk или ww |
Неделя |
dw или w |
День недели |
dy или y |
День года |
dd или d |
День |
hh |
Час |
mi или n |
Минута |
ss или s |
Секунда |
ms |
Миллисекунда |
Например, функция DATEADD принимает в качестве аргументов маркер datepart, величину приращения и исходную дату. Она возвращает результат добавления указанной величины в единицах, указанных в аргументе datepart, к текущей дате. Таким образом, чтобы добавить к текущей дате три дня, вы можете использовать следующий код:
PRINT DATEADD(d, 3, GETDATE())
Ниже приведен полный список доступных функций даты и времени.
В следующем примере запрос возвращает список всех заказов сделанных в сентябре месяце с указанием дня недели:
SELECT *, DATENAME(dw, OrdDate) AS 'День недели'
FROM [Order]
WHERE MONTH(OrdDate) = 9
Функции преобразования данных
Для явных преобразований одно типа данных в другой в SQL Server используют функции cast() и convert().
SELECT [Description], 'Остаток на складе: ' + CAST(InStock AS varchar(10))
FROM Product