Новости сайта "Упражнения по SQL" (http://www.sql-ex.ru) 144
Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 144 (30 июня 2007 г.)
Новым посетителям сайта
Сайт посвящен изучению языка, с помощью которого осуществляется взаимодействие с реляционными (и не только) СУБД. Суть обучения состоит в выполнении заданий на написание запросов к учебным базам данных; при этом система контролирует правильность выполнения заданий. В настоящее время реализованы все операторы подъязыка манипуляции данными (DML), которые включают в себя оператор извлечения данных SELECT, а также операторы модификации данных - INSERT, DELETE и UPDATE.
Мы надеемся, что справочного материала сайта окажется достаточно для самостоятельного обучения. Кроме того, свои решения вы можете обсудить на форуме сайта. Опытных же специалистов приглашаем проверить (продемонстрировать) свое мастерство и принять участие в соревновании, обеспечиваемом рейтинговой системой учета времени выполнения заданий. Фактически, рейтинг ведется на втором этапе тестирования, который начинается сейчас после решения 57-ти задач первого этапа. При подсчете рейтинга каждого
участника отбрасывается один самый худший показатель среди всех решенных им упражнений.
Демонстрация плана выполнения запроса и сравнительная оценка эффективности решений поможет вам освоить принципы оптимизации запросов, которые пригодятся на третьем рейтинговом этапе.
Имеется возможность получить сертификат по SQL DML при выполнении определенного количества заданий.
Новости сайта
§ После восстановления решений возникли некоторые недоразумения с временем решения. В ряде случаев время решения задачи оказалось равным 0. Удивительно то, что не всех это порадовало :-), и несколько авторов таких решений обратились ко мне с вопросами по этому поводу. Сейчас я принимаю меры по восстановлению справедливости, и прошу вас обращаться, если что-то в результатах вам покажется странным.
§ Палкин стал седьмым (и шестым в рейтинге), кто решил все задачи (время на третьем этапе 7.690).
Как поступить в SQL Server 2000, если вы захотите сразу запросить таблицу после оператора INSERT или UPDATE, чтобы вернуть значение столбца, подвергнувшегося изменению? Это может быть результат вычисляемого столбца или значение столбца identity, или некоторое другое значение по умолчанию. Обычно вы либо следом пишите оператор SELECT в хранимой процедуре, либо из своего приложения посылаете вызов обратно на сервер, чтобы получить этот результат. А как в SQL Server 2000 сразу вернуть и старое, и новое значения,
после обновления данных (UPDATE)? Зачастую вам приходится обращаться к системным таблицам INSERTED и DELETED, которые видны только в триггере.
Например, в SQL Server 2000, если мы хотим определить значение столбца IDENTITY после выполнения оператора INSERT, нам часто приходится использовать функцию SQL Server SCOPE_IDENTITY:
DECLARE @tTestTable TABLE ( MainPK [int] IDENTITY(1,1) NOT NULL, Name Char(50)) INSERT INTO @tTestTable VALUES ('steve Goff') SELECT SCOPE_IDENTITY()
SQL Server 2005 предоставляет новый оператор OUTPUT, который позволяет разработчикам решать эти задачи более удобно и эффективно.
Используя OUTPUT в сочетании с оператором INSERT/UPDATE, мы можем легко прочитать добавленную/измененную информацию. Вместо использования SCOPE_IDENTITY, мы можем сразу ВЫВЕСТИ значение столбца IDENTITY:
DECLARE @tTestTable TABLE ( MainPK [int] IDENTITY(1,1) NOT NULL, Name Char(50)) INSERT @tTestTable OUTPUT Inserted.MainPK VALUES ('steve Goff')
Если Вы выполняете несколько операторов INSERT, и вам необходим после этого список вставленных строк, Вы можете перенаправить ВЫВОД в таблицу:
DECLARE @tTestTable TABLE ( MainPK [int] IDENTITY(1,1) NOT NULL, Name Char(50)) DECLARE @tTemp table (mainpk int) INSERT @tTestTable OUTPUT Inserted.MainPK into @tTemp VALUES ('Kevin Goff') INSERT @tTestTable OUTPUT Inserted.MainPK into @tTemp VALUES ('steve Goff') SELECT * FROM @tTemp
Далее, если Вы выполняете оператор UPDATE и хотите сразу увидеть новое/старое значения из системных таблиц INSERTED и DELETED, Вы можете сделать следующее:
DECLARE @tTest TABLE ( MainPK [int] IDENTITY(1,1) NOT NULL ,Amount decimal(10,2)) INSERT INTO @tTest VALUES (100) INSERT INTO @tTest VALUES (200) INSERT INTO @tTest VALUES (300)
UPDATE @tTest SET Amount = Amount * 10 OUTPUT DELETED.MainPK, DELETED.Amount AS OldValue, INSERTED.Amount AS NewValue
И снова, если Вы хотите перенаправить результаты OUTPUT в табличную переменную, то можно сделать следующее:
UPDATE @tTest SET Amount = Amount * 10 OUTPUT DELETED.MainPK, DELETED.Amount AS OldValue, INSERTED.Amount AS NewValue INTO @tTemp
Одно замечание: не думайте о новой возможности OUTPUT как о замене аудиторской журнализации с помощью триггеров базы данных. Думайте об этом как об удобном средстве получить мгновенную обратную связь без необходимости обращаться к дополнительным операторам и/или лишним обращениям к серверу.
Триггеры базы данных предлагают лучшие средства реализации функциональных возможностей аудита.
(окончание следует...)
Полезная информация
§ Все статьи, публикуемые в рассылке, затем выкладываются на сайте Книги и статьи по SQL.
§ В продаже еще имеется книга SQL. Задачи и решения, посвященная анализу ошибок, допускаемых при решении задач первого этапа. На сайте издательства Питер можно сделать заказ и познакомиться с содержанием.
По всем вопросам, связанным с функционированием сайта, проблемами при решении упражнений, идеями вы можете обращаться к Сергею И.Моисеенко msi77@yandex.ru. Вы также можете предложить свои задачи для публикации на сайте.