(рисунок 2). Рисунок 2 – Получение данных из определенных свойств таблицы «Titles» 90 5.3 Задание условия, для результирующего результирующего набора 1. На панели в окне введите следующий код Transact- SQL: USE Pubs SELECT Title_id, Title, Price, Ytd_sales FROM Titles WHERE Price > 10 Теперь оператор извлечет лишь те строки, значение поля которых превышает $10. 2. Исполните оператор Transact-SQL. Результирующий набор выводится на вкладке панели (рисунок 3). Рисунок 3 – Получение данных из определенных свойств таблицы «Titles», удовлетворяющих заданному условию
91 5.4 Задание порядка, в котором выводится результирующий набор 1. На панели в окне введите следующий код Transact- SQL: USE Pubs SELECT Title_id, Title, Price, Ytd_sales FROM Titles WHERE Price > 10 ORDER BY Price DESC, Title Результирующий набор, который вернет этот оператор , упорядочивается сначала по цене (по убыванию), а затем по заглавию (по возрастанию). 2. Исполните оператор Transact-SQL. Результирующий набор выводится на вкладке панели (рисунок 4). Рисунок 4 – Получение данных из определенных свойств таблицы «Titles», удовлетворяющих заданному условию и отсортированных
92
5.5 Группировка данных в результирующем наборе 1. На панели
в окне введите следующий код Transact- SQL: USE Pubs SELECT Type, AVG(Price) AS AvgPrice FROM Titles WHERE Price > 10 GROUP BY Type ORDER BY AvgPrice DESC В результирующем наборе, который вернет этот оператор , группируются строки с одними и теми же значениями поля <Туре>. Строки, не соответствующие условиям конструкции , исключаются до начала любых операций по группировке. При группировке выполняется усреднение значений столбца , а полученное среднее значение вставляется в результирующий набор в виде столбца . Значения столбца упорядочиваются по убыванию. 2. Исполните оператор Transact-SQL. Результирующий набор выводится на вкладке панели (рисунок 5). Рисунок 5 – Использование группировки данных и агрегатных функций 93
5.6 Создание таблицы для размещения результирующего набора 1. На панели
в окне введите следующий код Transact- SQL: USE Pubs SELECT Type, AVG(Price) AS AvgPrice INTO TypeAvgPrice FROM Titles WHERE Price > 10 GROUP BY Type ORDER BY AvgPrice DESC Оператор создаст новую таблицу под названием . В столбцах <Туре> и размещаются значения результирующего набора. 2. Исполните оператор Transact-SQL. На вкладке панели выводится сообщение, где указано число строк, на которое повлияло исполнение оператора (рисунок 6). Рисунок 6 – Создание таблицы с результирующим набором данных 94 3. Введите и исполните следующий оператор TransactSQL: SELECT * FROM TypeAvgPrice Содержимое таблицы выводится на вкладке панели (рисунок 7). Рисунок 7 – Извлечение всех данных из таблицы «TypeAvgPrice» 4. Введите и исполните следующий оператор TransactSQL: DROP TABLE TypeAvgPrice На вкладке панели выводится сообщение об успешном завершении команды (рисунок 8). Рисунок 8 – Удаление таблицы «TypeAvgPrice» 5. Закройте .
95 5.7 Модификация данных в базе данных SQL Server. Создание таблицы в базе данных 1. Откройте и подключитесь к локальному серверу. 2. Введите на панели в окне следующий код на Transact- SQL: USE Pubs CREATE TABLE Test1 ( RowID INT IDENTITY(1,1) NOT NULL, Title VARCHAR(80) NOT NULL, Type CHAR(12) NOT NULL DEFAULT ('Unknown'), City VARCHAR(50) NULL, Cost MONEY NULL ) Этот оператор создает таблицу под названием «Test1», состоящую из пяти столбцов. 3. Исполните оператор Transact-SQL. На вкладке панели выводится сообщение об успешном завершении команды (рисунок 9). Рисунок 9 – Создание таблицы «Test1»
96 5.8 Добавление данных с помощью операторов 1. Введите на панели в окне следующий код на Transact- SQL: INSERT INTO Test1 (Title, Type, Cost) VALUES ('Test Title', 'business', 27.00) Этот оператор вставляет строку в таблицу «Test1». В строке содержатся значения полей , и . 2. Исполните оператор Transact-SQL. На вкладке панели выводится сообщение о том, что исполнение оператора повлияло на одну строку (рисунок 10). Рисунок 10 – Добавление данных в таблицу «Test1» 3. Напишите оператор , который позволит просмотреть все данные из таблицы «Test1». 4. Исполните оператор . Содержимое таблицы «Test1» отобразится на вкладке панели . 5. Изучите содержимое таблицы «Test1». Обратите внимание, что в таблице имеется только одна строка – та, которую вы добавили с помощью оператора . SQL Server
97 автоматически сгенерировал значение поля . Значение поля – пустое, поскольку оно не было определено. 5.9 Добавление данных с помощью операторов 1. Введите на панели в окне следующий код на Transact- SQL: INSERT INTO Test1 (Title, Type, Cost) SELECT Title, Type, Price FROM Pubs.dbo.Titles Этот оператор берет данные из таблицы в базе данных и вставляет их в таблицу «Test1». 2. Исполните оператор Transact-SQL. На вкладке панели выводится сообщение, где указано число строк, на которые повлияло исполнение оператора (рисунок 11). Рисунок 11 – Добавление в таблицу «Test1» данных из таблицы «Titles» 3. Воспользуйтесь оператором для просмотра данных таблицы «Test1». Обратите внимание, что значения поля сгенерированы автоматически, а в поле каждой строки содержится пустое значение.
98
5.10 Модификация данных с помощью оператора 1. Просмотрите данные таблицы «Test1».
Если на панели
остались результаты предыдущего запроса , то можно воспользоваться ими. В противном случае используйте для просмотра содержимого таблицы оператор
. 2. Запишите названия нескольких книг, значение поля <Турe> которых равно «business», a также их цену. Эти данные пригодятся во время модификации таблицы. 3. Введите на панели в окне следующий код на Transact- SQL: UPDATE Test1 SET Cost = Cost * 2 WHERE Type = 'business' Этот оператор в два раза увеличивает значение поля по сравнению с исходным значением для книг типа «business». 4. Исполните оператор Transact-SQL. На вкладке панели выводится сообщение, где указано число строк, на которые повлияло исполнение оператора (рисунок 12). Рисунок 12 – Обновление данных в таблице «Test1» 99 5. Воспользуйтесь оператором для просмотра данных таблицы «Test1». Обратите внимание на удвоенное значение поля для каждой книги типа «business». 5.11 Удаление данных из таблицы с помощью оператора 1. Введите на панели в окне следующий код на SQL>: DELETE Test1 WHERE Title = 'Test Title' Этот оператор удаляет все строки из таблицы, в столбце которой указано значение «Test Title». 2. Исполните оператор Transact-SQL. На вкладке панели выводится сообщение, где указано число строк, на которые повлияло исполнение оператора (рисунок 13). Рисунок 13 – Удаление данных из таблицы «Test1» 3. Воспользуйтесь оператором для просмотра данных таблицы «Test1». Обратите внимание, что строка удалена из таблицы. 4. Введите на панели в окне следующий код на Transact- SQL: DELETE Test1
100 Этот оператор удаляет все строки таблицы «Test1». 5. Исполните оператор Transact-SQL. На вкладке панели выводится сообщение, где указано число строк, на которые повлияло исполнение оператора (рисунок 14). Рисунок 14 – Удаление всех строк таблицы «Test1» 6. Воспользуйтесь оператором для просмотра данных таблицы «Test1». Обратите внимание на отсутствие данных в таблице «Test1». 5.12 Удаление таблицы с помощью оператора 1. Введите на панели в окне следующий код на Transact- SQL: DROP TABLE Test1 Этот оператора удаляет таблицу «Test1» из базы данных 2. Исполните оператор Transact-SQL. На вкладке панели выводится сообщение об успешном завершении команды (рисунок 15).
101 Рисунок 15 – Удаление таблицы «Test1» 3. С помощью окна удостоверьтесь, что таблица «Test1» удалена из базы данных. 4. Закройте . 5.13 Контрольное задание 1. Средствами SQL Server 2000 создать четыре таблицы в базе данных . При создании таблиц выполнить следующие условия: − поля номер_поставщика, номер_детали, номер_изделия во всех таблицах имеет символьный тип (char) и длину 6; − поля рейтинг, вес и количество имеют целочисленный тип (int); − поля фамилия, город (поставщика, детали или изделия), название (детали или изделия) имеют символьный тип nchar и длину 20; − для всех полей допускаются значения NULL и значения-дубликаты, кроме поля номер_поставщика из таблицы «S», номер детали из таблицы «P», номер изделия из таблицы «J». Таблица 1 – Таблица поставщиков «S» Номер поставщика Фамилия Рейтинг Город S1 Смит 20 Лондон S2 Джонс 10 Париж S3 Блейк 30 Париж S4 Кларк 20 Лондон S5 Адамс 30 Афины
102 Таблица 2 – Таблица деталей «P» Номер детали Название Цвет Вес Город P1 Гайка Красный 12 Лондон P2 Болт Зеленый 17 Париж P3 Винт Голубой 17 Рим P4 Винт Красный 14 Лондон P5 Кулачок Голубой 12 Париж P6 Блюм Красный 19 Лондон Таблица 3 – Таблица изделий «J» Номер изделия Название Город J1 Жесткий диск Париж J2 Перфоратор Рим J3 Считыватель Афины J4 Принтер Афины J5 Флоппи-диск Лондон J6 Терминал Осло J7 Лента Лондон Таблица 4 – Таблица поставок «SPJ» Номер поставщика Номер детали Номер изделия Количество S1 P1 J1 200 S1 P1 J4 700 S2 P3 J1 400 S2 P3 J2 200 S2 P3 J3 200 S2 P3 J4 500 S2 P3 J5 600 S2 P3 J6 400 S2 P3 J7 800 S2 P5 J2 100 S3 P3 J1 200 S3 P4 J2 500 S4 P6 J3 300 S4 P6 J7 300 S5 P2 J2 200 S5 P2 J4 100 S5 P5 J5 500 S5 P5 J7 100 S5 P6 J2 200 S5 P1 J4 100 S5 P3 J4 200 S5 P4 J4 800 S5 P5 J4 400 S5 P6 J4 500
103 2. Убедиться в успешности выполненных действий. При необходимости исправить ошибки. 3. Используя Query Analizer, выполнить модификацию структуры таблиц «S» и «SPJ», добавив в «SPJ» поле с датой поставки. Убедиться в успешности выполненных действий. При необходимости исправить ошибки. 4. Проверить результат заполнения таблиц, написав и выполнив простейший запрос select * from имя_таблицы 5. Связать все эти таблицы и обеспечить целостность данных. 6. Согласно выданному преподавателем варианту выполнить задания, описанные ниже. 5.14 Варианты заданий на составление запросов по выборке информации из таблиц базы данных Вариант 1 1. Выдать общее количество деталей «P1», поставляемых поставщиком «S1». 2. Получить все пары названий городов, таких, что какой-либо поставщик из первого города поставляет детали для некоторого изделия, изготовляемого во втором городе. 3. Выдать номера изделий, использующих только детали, поставляемые поставщиком «S1». 4. Получить номера деталей, поставляемых каким-либо поставщиком из Лондона, для изделия, изготавливаемого также в Лондоне. Вариант 2 1. Выдать номера и фамилии поставщиков, поставляющих по крайней мере одну деталь, поставляемую по крайней мере одним поставщиком, который поставляет по крайней мере одну красную деталь.
104 2. Получить полный список деталей для всех изделий, изготавливаемых в
Лондоне.
3.
Выдать номера деталей , поставляемых каким-либо поставщиком из
Лондона.
4. Получить номера деталей, поставляемых для всех изделий из Лондона.
Вариант 3 1. Выдать номера изделий, для которых детали поставляются по крайней мере одним поставщиком не из того же самого города.
2. Получить список всех поставок, в которых количество деталей находится в диапазоне от 300 до 750 включительно.
3. Выдать номера изделий, использующих по крайней мере одну деталь, поставляемую поставщиком «S1».
4. Получить номера и названия деталей, поставляемых для какого-либо изделия в Лондоне.
Вариант 4 1. Выдать номера и названия изделий, для которых город является первым в алфавитном списке таких городов.
2. Получить цвета деталей, поставляемых поставщиком «S1».
3. Выдать номера и фамилии поставщиков, поставляющих деталь «Р1» для какого-либо изделия в количестве, большем среднего объема поставок детали
«Р1» для этого изделия.
4. Получить полный список деталей для всех изделий.
Вариант 5 1. Выдать названия изделий, для которых поставляются детали поставщиком «S1».
2. Получить номера деталей, поставляемых для какоголибо изделия поставщиком, находящимся в том же городе, где изготавливается это изделие.
105 3. Выдать номера и названия изделий, для которых поставщик «S1» поставляет несколько деталей каждого из поставляемых им типов. 4. Получить номера изделий, для которых средний объем поставки деталей «P1» больше наибольшего объема поставки любой детали для изделия «J1». 5.15 Варианты заданий на составление запросов по модификации информации из таблиц базы данных Вариант 1 1. Увеличить на 10 рейтинг всех поставщиков, рейтинг которых в настоящее время меньше, чем рейтинг поставщика «S4». 2. Постройте таблицу, содержащую список номеров изделий, которые либо находятся в Лондоне, либо для них поставляются детали каким-нибудь поставщиком из Лондона. Вариант 2 1. Удалить все изделия, для которых нет поставок деталей. 2. Построить таблицу с номерами поставщиков и парами номеров деталей, таких, что некоторый поставщик поставляет обе указанные детали. Вариант 3 1. Увеличить размер поставки на 10 процентов для всех поставок тех поставщиков, которые поставляют какую-либо красную деталь. 2. Построить таблицу с комбинациями «цвет деталигород, где хранится деталь», исключая дубликаты пар (цветгород). Вариант 4 1. Построить таблицу, содержащую список номеров деталей, которые поставляются либо каким-нибудь поставщиком из Лондона, либо для какого- либо изделия в Лондон.
106 2. Вставить в таблицу «S» нового поставщика с номером «S10» с фамилией Уайт из города Нью-Йорк с неизвестным рейтингом. Вариант 5 1. Удалить все изделия из Рима и все соответствующие поставки. 2. Построить таблицу с упорядоченным списком всех городов, в которых размещаются по крайней мере один поставщик, деталь или изделие. Вариант 6 1. Изменить цвет красных деталей с весом менее 15 фунтов на желтый. 2. Построить таблицу с номерами изделий и городов, где они изготавливаются, такие, что второй буквой названия города является «О». Вариант 7 1. Увеличить на 10 рейтинг тех поставщиков, объем поставки которых выше среднего. 2. Построить таблицу с упорядоченным списком номеров и фамилиями поставщиков, поставляющих детали для изделия с номером «J1». Осуществить выборку и модификацию данных согласно выбранному вами варианту базы данных. 5.16 Контрольные вопросы 1. Каким образом выполнить простейшие операции вставки строк данных в таблицу средствами T-SQL? 2. Как осуществить простейшие операции модификации строк таблицы средствами T-SQL? 3. Как выполнить просмотр таблицы? 4. Как сохранить результаты запроса в таблице?
107 6 Лабораторная работа № 6. Управление и манипулирование данными Цель работы: выработка умений и навыков работы с операторами , , и простейшими формами оператора . Используемое программное обеспечение: Microsoft SQL Server 2017. Язык управления данными используется для управления правами доступа к данным и выполнением процедур в многопользовательской среде. Более точно его можно назвать «язык управления доступом». Он состоит из двух основных команд: − – предоставить привилегии пользователю или приложению на манипулирование объектами. − – отменить привилегии пользователя или приложения (забрать права). Операторы манипулирования данными: − – отобрать строки из таблиц. − – добавить строки в таблицу. − – изменить строки в таблице. − – удалить строки в таблице. 6.1 Управление данными. Предоставление права доступа к объекту базы данных с помощью 1. На панели введите следующий оператор : GRANT UPDATE, SELECT, INSERT, DELETE ON Поставщик TO PUBLIC 2. Выделите оператор и выполните его.
108 На вкладке панели выводится сообщение о том, что команда успешно завершена (рисунок 1). Рисунок 1 – Предоставление права доступа к таблице «Поставщик» 3. Введите следующий оператор : EXEC sp_helprotect Поставщик 4. Исполните оператор . На вкладке панели отображаются данные о разрешениях пользователя для таблицы «Поставщик». Роли предоставлено право доступа , , , для этой таблицы (рисунок 2).
109 Рисунок 2 – Отображение данных о разрешениях пользователя для таблицы «Поставщик» с помощью 6.2 Отзыв права доступа к объекту базы данных 1. Введите следующий оператор : REVOKE UPDATE, SELECT, INSERT, DELETE ON Поставщик TO PUBLIC 2. Выделите оператор и выполните его. На вкладке панели выводится сообщение, свидетельствующее об успешном завершении команды (рисунок 3).
110 Рисунок 3 – Отзыв права доступа к таблице «Поставщик» 3. Введите следующий оператор : EXEC sp_helprotect Поставщик 4. Исполните оператор . На вкладке панели выводится сообщение об отсутствии строк, совпадающих с критерием запроса. Поскольку у роли права доступа отозваны, теперь нет и предоставленных или отобранных прав доступа, о которых сообщает хранимая процедура (рисунок 4). Рисунок 4 – Сообщение об отсутствии прав доступа на выборку данных из таблицы «Поставщик»
111 6.3 Предоставление права доступа к объекту базы данных с помощью 1. Запустите . 2. В базе данных выберете таблицу «Поставщик» и щелкните по ней 2 раза. 3. В появившимся окне <Свойства таблицы> нажмите на кнопку 4. Для роли разрешите выборку и вставку, запретите изменение и удаление (рисунок 5). Рисунок 5 – Предоставление права доступа к таблице «Поставщик» с помощью
112 5. Выбрав роль и нажав на кнопку , можно выбрать для каких столбцов будет разрешена или запрещена выборка и изменение. 6. Разрешите роли изменение и удаление. 6.4 Манипулирование данными. Обновление данных 1. Запустите . 2. Введите следующий оператор и выполните его: USE Northwind UPDATE Поставщик SET Тел_поставщика = 89246541252 WHERE Код_поставщика = 03 На вкладке появляется сообщение о том, что исполнение оператора повлияло на одну строку (рисунок 6). Рисунок 6 – Обновление данных в таблице «Поставщик» 6.5 Выборка данных Исполните следующий оператор : SELECT * FROM Поставщик На панели отображаются три строки из таблицы «Поставщик». Обратите внимание, что значение поля <Тел_поставщика> для Захарова М. В. теперь равно 89246541252 (рисунок 7).
113 Рисунок 7 – Извлечение всех данных из таблицы «Поставщик» 6.6 Удаление данных Наберите следующий оператор и исполните его: DELETE FROM Поставщик WHERE Код_поставщика = 02 На вкладке выводится сообщение о том, что исполнение оператора повлиял на одну строку (рисунок 8). Рисунок 8 – Удаление из таблицы «Поставщик» записей, у которых <Код_поставщика> = 02 Исполните следующий оператор :
114 SELECT * FROM Поставщик Теперь на панели осталось только две строки из таблицы «Поставщик». Обратите внимание на отсутствие в списке имени Иванов С. П. (рисунок 9). Рисунок 9 – Просмотр изменений в таблице «Поставщик» 6.7 Удаление таблицы Введите следующий оператор и исполните его: DROP TABLE Поставщик На вкладке появляется сообщение об ошибке. Обеспечение целостности данных, созданное в лабораторной работе № 4, не позволяет удалить эту таблицу. Таблицу «Поставщик» возможно удалить, если только перед этим удалить ее связь с таблицей «Товар». Закройте 6.8 Контрольное задание Назначьте права доступа к данным в базе данных согласно выбранному вами варианту.
115 6.9 Контрольные вопросы 1. Какие операторы управления Вы знаете? 2. Перечислите операторы манипулирования данными. 3. Опишите синтаксис операторов , , .
116 7 Лабораторная работа № 7. Управление и манипулирование данными Цель работы: используя операторы T-SQL, научиться создавать хранимые процедуры и управлять ими. Используемое программное обеспечение: Microsoft SQL Server 2017. Хранимая процедура – компилируемый объект базы данных, хранящийся на сервере и представляющий собой набор SQL-инструкций. Хранимые процедуры могут обладать: 1) входными и выходными параметрами; 2) локальными переменными; 3) циклами и ветвлениями, то есть в них могут использоваться инструкции управления потоком; 4) в них могут производиться: − стандартные операции с базами данных (как DDL, так и DML); − числовые вычисления; − операции над символьными данными. 5) результаты которых могут присваиваться переменным и параметрам. С точки зрения приложений, работающих с базами данных, хранимые процедуры – это подпрограммы, которые выполнятся на сервере. По отношению к базе данных, хранимые процедуры – это объекты, которые создаются и хранятся в ней. Они могут быть вызваны из клиентских приложений. При этом одна процедура может быть использована в любом количестве клиентских приложений. 7.1 Создание и вызов процедуры. Создание процедуры CREATE PROC[EDURE] имя_процедуры [; номер ] [@параметр тип_данных [VARYING] [= значение ] [OUTPUT] [,…]
117 [WITH {RECOMPILE I ENCRYPTION|RECOMPILE|ENCRYPTION}] [FOR REPLICATION] AS команды SQL [RETURN [код_статуса ]] Имя_процедуры подчиняется стандартным правилам выбора имен объектов: − в рамках одной базы данных для процедур с одинаковыми именем и владельцем номер должен быть уникальным; − имена локальных временных процедур должны начинаться с символа #; − имена глобальных временных процедур должны начинаться с символов ##. Номер используется для группировки процедур как единого целого (часто в сочетании с версией приложения). @параметр – представляет параметр, передаваемый и / или получаемый из процедуры. Процедура имеет до 1024 параметров. Параметры могут принимать значения . Они не могут использоваться в процедуре вместо объектов баз данных, если только они не включаются в команду . Параметры относятся к встроенным либо пользовательским типам данных. Обратите внимание, правила, значения по умолчанию и свойства столбцов не относятся к параметрам, определяемым пользовательскими типами данных. Параметр может относиться к любому типу данных SQL Server, в том числе , или . Для параметров типа ключевые слова varying и output являются обязательными. VARYING означает, что параметр возвращает итоговый набор. Используется только для типа данных . Значение определяет значение параметра по умолчанию. Может быть любой константой или .
118 OUTPUT означает, что параметр является выходным, то есть может возвращаться стороне, вызвавшей процедуру. Параметры типа обязаны быть выходными. ENCRYPTION означает, что таблица должна шифроваться (благодаря чему текст процедуры скрывается от постороннего взгляда). FOR REPLICATION означает, что процедура участвует в процессе публикации. Обратите внимание, параметры и являются взаимоисключающими. Команды SQL – произвольное количество команд SQL, составляющих тело процедуры. Максимальный объем команд не должен превышать 128 Кбайт. 7.2 Вызов процедуры [EXEC[UTE]] [@код_возврата = ] имя_процедуры [;номер] [@список_параметров ] [WITH RECOMPILE] @код_возврата – переменная для сохранения кода возврата процедуры. Номер – числовой идентификатор процедуры. При отсутствии этого аргумента выполняется процедура с максимальным номером версии. @список параметров – список параметров процедуры. Параметры передаются как по имени (имя = значение), так и по позиции в списке, но если некоторый параметр передается по имени, все последующие параметры в списке тоже должны передаваться по имени. Чтобы пропустить параметр в середине списка, следует передавать остальные параметры по имени. WITH RECOMPILE – процедура заново компилируется при выполнении. Удаление процедуры: DROP PROC имя_процедуры [, имя_процедуры[, ...]]
119 7.3 Системные хранимые процедуры. Просмотр системных хранимых процедур в базе данных 1. Откройте и подключитесь к локальному серверу. 2. Откройте окно , если оно еще не открыто. В окне выводится иерархическое дерево объектов базы данных. 3. Раскройте узел . Появляется список типов объектов. Обратите внимание на узлы и . 4. Раскройте узел . Появляется список хранимых процедур и расширенных хранимых процедур базы данных . 5. Изучите имена процедур из списка. Обратите внимание, что владельцем всех процедур является . 6. Раскройте системную хранимую процедуру dbo.sp_who. Появляются узлы и . 7. Раскройте узел (рисунок 1). Рисунок 1 – Просмотр параметров системной хранимой процедуры «dbo.sp_who» Обратите внимание, что для этой процедуры определены два параметра: <@RETURN_VALUE> и <@loginame. @RETURN_VALUE> – это встроенный
120 параметр, который используется для хранения кодов возврата, он есть у всех хранимых процедур, <@loginame> – это входной параметр. 8. Зависимость . Обратите внимание, что эта хранимая процедура зависит только от таблицы «dbo.sys-processes». Это системная таблица, которая хранится в базе данных . Системная хранимая процедура «sp_who» выполняет запрос к таблице «SysProcesses» и выводит часть ее данных в своем результирующем наборе. Эту таблицу можно найти, раскрыв узел . 9. Если вы уже просмотрели таблицы «dbo.sysprocesses», вернитесь к системной хранимой процедуре «sp_who» в окне . 10. Прокрутите содержимое , пока не увидите узел . Обратите внимание на три хранимые процедуры с префиксом <хр_>, которые расположены непосредственно над узлом Procedures>. Они не являются расширенными. 11. Раскройте узел . Прокручивая список объектов этого узла, обратите внимание на наличие в нем как системных, так и расширенных хранимых процедур. Большинство процедур из этого узла являются расширенными (рисунок 2).
121 Рисунок 2 – Просмотр хранимых процедур узла Extended Procedures
122 12. Оставьте открытым. 7.4 Методы просмотра содержимого хранимой процедуры 1. Щелкните правой кнопкой мыши по объекту «dbo.sp_who». Появляется контекстное меню этого объекта. 2. Выберите (рисунок 3). Рисунок 3 – Просмотр содержимого хранимой процедуры (1-й способ) Выводится диалоговое окно . 3. Установите флажок и щелкните <ОК> (рисунок 4).
123 Рисунок 4 – Установление флажка Script> Этот параметр выводит около заголовка текста хранимой процедуры ее имя и дату создания. 4. Щелкните правой кнопкой мыши по объекту «dbo.sp_who». Выводится контекстное меню для него. 5. Укажите и щелкните (рисунок 5).
124 Рисунок 5 – Просмотр содержимого хранимой процедуры (2-й способ) В окне появляется хранимая процедура «dbo.sp_who». Обратите внимание, что рядом с заголовком файла появляются ключевые слова (рисунок 6). Рисунок 6 – Листинг хранимой процедуры 6. Щелкните на панели инструментов кнопку или нажмите . На правой панели появляется окно нового запроса. 7. На панели в окне введите следующий код Transact- SQL: sp_helptext [master.dbo.sp_who]
125 В этой команде для вывода содержимого системной хранимой процедуры «sp_who», которая содержится в базе данных , используется системная хранимая процедура «sp_helptext». Хотя указывать полное имя хранимой процедуры не обязательно, лучше это все-таки делать – в этом случае вы гарантированно откроете именно тот объект, который вам нужен. 8. Исполните команду. Содержимое системной хранимой процедуры «sp_who» выводится на вкладке панели (рисунок 7). Рисунок 7 – Содержимое системной хранимой процедуры
126 7.5 Создание и исполнение хранимой процедуры в базе данных 1. Откройте и подключитесь к локальному серверу. 2. Закройте окно , если оно открыто. 3. Раскройте окно , чтобы оно заняло все рабочее пространство в . 4. На панели в окне введите следующий код: USE Northwind GO CREATE PROCEDURE dbo.CustOrderHistRep @CustomerID char(5) AS SELECT ContactName, ContactTitle FROM Customers WHERE CustomerID = @CustomerID SELECT ProductName, Total=SUM(Quantity) FROM Products P, [Order Details] OD, Orders O, Customers С WHERE С.CustomerID = @CustomerID AND С.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID AND OD.ProductID = P.ProductID GROUP BY ProductName GO При исполнении первого пакета база данных становится текущей. Далее создается процедура и определяется единственный входной параметр – <@CustomerID>. Входной параметр может располагаться в одной строке с оператором , но здесь для ясности он перенесен в отдельную строку. Аналогичный подход использован далее при разбиении по строкам кода операторов . Обратите внимание, что для параметра <@CustomerID> задан тип данных . Если выполнить запрос к таблице «[Northwind].[dbo].[Customers]», то видно, что длина
127 всех идентификаторов покупателей равна пяти символам. Строка, в которой находится единственное ключевое слово
, является разделительной линией между созданием процедуры в таблице «SysObjects» и текстом процедуры, сохраняемым в таблице «SysComments». 5. Просмотрите операторы , которые расположены ниже ключевого слова . При исполнении запроса в ответ на ввод идентификатора покупателя первый оператор выводит имя контактного лица и заголовок контактной информации. Второй оператор выводит названия и общее количество () каждого товара, который приобрел покупатель. Результирующий набор возвращает данные, сгруппированные по названию товара. Можно заметить, что несколько соединений реализовано в конструкции , а не . Во время модификации процедуры мы переместим выражения в конструкцию (рисунок 8). Рисунок 8 – Создание хранимой процедуры 128 7.6 Просмотр хранимых процедур в 1. Откройте в и выберите базу данных . 2. Раскройте узел . Появляются все хранимые процедуры, созданные в базе данных . 1. Раскройте хранимую процедуру «dbo.CustOrderHistRep». Обратите внимание, что эта хранимая процедура принадлежит и что в «dbo.CustOrderHistRep» появляются два узла: и . 2. Раскройте узел Обратите внимание на наличие у этой хранимой процедуры двух параметров: созданного вами <@CustomerID> и встроенного параметра для хранения кода возврата <@RETURN_VALUE>. 3. Раскройте узел . Обратите внимание, что хранимая процедура зависит от четырех объектов (таблиц «Orders», «Products», «Order Details» и «Customers» из базы данных ). От самой хранимой процедуры не зависит ни один объект (рисунок 9).
129 Рисунок 9 – Отображение содержимого узлов и хранимой процедуры «CustOrderHistRep» 1. Переключитесь на панель окна . 2. Введите в пустой строке в нижней части панели и исполните следующую команду: sp_depends custorderhistrep Хранимая процедура «sp_depends» проверяет процедуру «CustOrderHistRep», чтобы определить ее зависимости. Обратите внимание на наличие в поле повторяющихся элементов. Однако все записи с повторяющимися элементами отличаются значениями других полей (рисунок 10). Рисунок 10 – Проверка процедуры «CustOrderHistRep» для определения ее зависимости
130 3. Не закрывайте , он потребуется для выполнения следующего задания. 7.7 Исполнение хранимой процедуры 1. В нижней части панели введите в пустой строке и исполните следующую команду: EXEC [Northwind]. [dbo]. [custorderhistrep] @CustomerID = 'thecr' Для запуска хранимой процедуры «CustOrderHistRep» использована сокращенная версия ключевого слова – . Обратите внимание на использование полного имени. Это не обязательно, но в данном случае такой прием позволяет запустить процедуру, не делая активной базу данных . Возвращаются два результирующих набора. Первый из них (имя контактного лица и заголовок контактной информа ции) выводится в верхней части панели . Второй результирующий набор (название и количество товара) отображается в нижней части панели (рисунок 11). Рисунок 11 – Вызов процедуры «CustOrderHistRep» с указанием значения параметра 2. В предыдущем примере для запуска хранимой процедуры было задано ключевое слово . Обязательно ли его использовать?
131 3.
Найдите в
Browser> хранимую процедуру «dbo.CustOrderHistRep» и щелкните по ней правой кнопкой мыши. 4. Выберите из контекстного меню