Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Новости сайта "Упражнения по SQL" (http://www.sql-ex.ru)


Информационный Канал Subscribe.Ru

Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 47 (6 августа 2005 г.)

http://www.sql-ex.ru

Новым посетителям сайта

Сайт посвящен изучению языка, с помощью которого осуществляется взаимодействие с реляционными (и не только) СУБД. Суть обучения состоит в выполнении заданий на написание запросов к учебным базам данных; при этом система контролирует правильность выполнения заданий. В настоящее время реализованы все операторы подъязыка манипуляции данными (DML), которые включают в себя оператор извлечения данных SELECT, а также операторы модификации данных - INSERT, DELETE и UPDATE.

Мы надеемся, что справочного материала сайта окажется достаточно для самостоятельного обучения. Кроме того, свои решения вы можете обсудить на форуме сайта. Опытных же специалистов приглашаем проверить (продемонстрировать) свое мастерство и принять участие в соревновании, обеспечиваемом рейтинговой системой учета времени выполнения заданий. Фактически, рейтинг ведется на втором этапе тестирования, который начинается сейчас после решения 59-ти задач первого этапа. При подсчете рейтинга каждого участника отбрасывается один самый худший показатель среди всех решенных им упражнений.

Имеется возможность получить сертификат по SQL DML при выполнении определенного количества заданий.


Новости сайта

§ Проблемы с сервером DNS решены. Сайт функционирует в обычном режиме. В частности, имеющаяся литература доступна для скачивания.

§ На днях приняли мою заявку на регистрацию сайта в общественном каталоге на ZEAL.COM. ZEAL.COM использует рейтинговую систему для сайтов. Просьба проголосовать, если получится (честно говоря, не уверен, что это может сделать каждый посетитель). Худшая оценка 1, лучшая - 5. Надеюсь, что это позволит со временем сделать наши соревнования международными :-).

§ А вот на Интернить проголосовать получится точно. Конкурс подходит к своему завершению, а наши позиции выглядят неубедительно. Оценки от 1 до 3.

§ Число подписчиков - 2287

Число участников рейтинга - 3708

Число участников второго этапа - 346

Лучшие результаты (ТОР 20)

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 LastSolved LastVisit
1 Кувалкин К.С. (Cyrilus) 137 112 20 312 224 5.129 06 Jul 2005 27 Jul 2005
2 Гонтовой В.А. (noname) 137 112 20 312 105 9.808 29 Jun 2005 02 Jul 2005
3 Леденев С.А. (Shurgenz) 137 112 20 312 313 9.900 27 Jun 2005 27 Jul 2005
4 Бураков С.Г. (burakov58) 137 137 20 312 164 12.100 12 Jul 2005 31 Jul 2005
5 Валуев Д.И. (Fiolent) 137 112 20 312 662 26.627 27 Jun 2005 05 Aug 2005
6 Галиаскаров Э.Г. (Galogen) 137 112 20 312 221 61.437 01 Jul 2005 01 Jul 2005
7 Мельникова И.А. (Iris_m) 135 137 20 308 380 89.865 27 May 2005 14 Jun 2005
8 Зверев Д.Л. (dimzv) 135 136 20 306 580 2.471 06 Jun 2005 15 Jun 2005
9 Колосов А.С. (KAS) 134 137 20 306 25 3.398 11 Mar 2005 14 Jun 2005
10 Сныткин В.Л. (Ded I) 134 136 20 304 252 7.456 12 May 2005 21 Jul 2005
11 Рахманов И.Е. (bloom) 134 136 20 304 148 14.171 11 May 2005 15 Jun 2005
12 Hakobyan H.H. (hamlet) 134 136 20 304 220 37.869 07 May 2005 03 Jun 2005
13 Шипунов И. (IAS) 134 136 20 304 334 82.080 13 May 2005 26 May 2005
14 Иткин И.Л. (joseph_itkin) 132 136 20 299 375 2.849 07 Mar 2005 13 Apr 2005
15 Spirin (spirin) 131 136 19 296 158 13.461 21 Jan 2005 24 Jan 2005
16 Shark_ (Shark) 128 128 20 293 25 2.225 05 Aug 2005 05 Aug 2005
17 Михайлов В.Г. (mslava) 132 136 17 293 648 10.504 25 Mar 2005 25 Mar 2005
18 Gershovich (VIG) 128 128 20 293 850 13.073 09 Jul 2005 05 Aug 2005
19 Пятница О.А. (Robin) 125 128 20 287 754 74.630 19 Mar 2005 14 Jul 2005
20 Митронин А.А. (mitronin) 123 124 20 283 701 27.541 31 May 2005 01 Jun 2005

Лучшие результаты за неделю

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Напорова С.М. (SN) 48 48 82 0 82 578 05 Aug 2005
2 Заворотнев В.В. (vvz) 32 47 64 1 65 577 05 Aug 2005
3 Шилова Н. (Neznakomka) 18 56 48 14 62 256 05 Aug 2005
4 Сучков А. (andrews_) 30 41 61 0 61 679 05 Aug 2005
5 >Сологубова А.М. (Анна) 28 56 50 1 51 436 05 Aug 2005
6 Банкет В.В. (Viacheslav) 37 37 50 1 51 990 05 Aug 2005
7 Носков Н.В. (niko2) 19 119 47 0 47 25 05 Aug 2005
8 Гладков Д.А. (carbon) 25 33 44 1 45 951 05 Aug 2005
9 Омельченко А.В. (Goer) 21 38 44 0 44 766 03 Aug 2005
10 Shark_ (Shark) 15 128 35 0 35 16 05 Aug 2005
11 korolev A. (Molodecz) 23 23 34 0 34 1381 05 Aug 2005
12 Пономарев (alexpon) 12 48 31 0 31 589 05 Aug 2005
13 UNUULU B. (bako) 24 24 27 1 28 1590 05 Aug 2005
14 Левин В.Б. (LeVSy) 11 32 24 0 24 960 05 Aug 2005
15 Вишняков А.В. (AlexVishn) 16 16 19 4 23 1718 05 Aug 2005
16 Харланов С.В. (harley80) 12 27 21 0 21 1227 05 Aug 2005
17 Шапиро (b7) 17 17 21 0 21 1778 04 Aug 2005

Изучаем SQL

Массивы в SQL Server 2000 (окончание, начало в вып.46)

Alex Grinberg (оригинал: The ARRAY In SQL Server 2000)
Перевод Моисеенко С.И.

Теперь после передачи строк XML в ТП, мы можем использовать полученный результат в предложении IN.

USE NorthWind

CREATE PROC GetRegions_XML
    @empdata text
AS

DECLARE @hDoc int
DECLARE @tbl TABLE(state VARCHAR(20))

exec sp_xml_preparedocument @hDoc OUTPUT, @empdata

INSERT @tbl
     SELECT StateName
     FROM OPENXML(@hDoc, 'root/States')
     WITH (StateName VARCHAR(20))

EXEC sp_xml_removedocument @hDoc

SELECT * FROM Suppliers
WHERE Region IN (SELECT * FROM @tbl)

/*
declare @s varchar(100)
set @s = '<root><States StateName = "LA"/>
          <States StateName = "MI"/>
          <States StateName = "OR"/></root>'
exec GetRegions_XML @s
*/

Использование курсоров

Каждый знает о том, что курсоры съедают память. Именно поэтому рекомендуют использовать их как последнее средство, когда нет никаких других способов решить проблему. Это справедливо. Прошло довольно времени с тех пор, как я последний раз использовал курсор в моей практике программирования на T-SQL. И это понятно, т.к. с тех пор появилась намного лучшая альтернатива: использование ТП, которая великолепно работает и не так расточительна к ресурсам.

Одна из основных причин использования курсора - функциональные возможности, которые позволяют работать с каждой отдельной строкой из данного результирующего набора. При кодировании подобной функциональной возможности с помощью ТП-массива нам потребуется идентификатор строки или ID для каждой строки. Использование свойства Identity очень удобно для этого. Свойство Identity может служить уникальным идентификатором для каждой строки и позволит сымитировать функциональность Fetch для построчной обработки.

Ниже приведена сравнительная таблица для двух хранимых процедур, одна из которых использует традиционный курсор, и вторая - ТП. Вы можете обратить внимание, что хранимая процедура на основе курсора содержит меньше строк кода. Однако деятельность и ресурсы, используемые SQL Server, намного выше по сравнению с использованием ТП. Действительно, объявление курсора и использование операторов Fetch является компактным и прямым. В случае использования ТП, определенно используется больше кода, но это дает программисту больше возможностей по управлению и экономит ресурсы SQL Server и процессорное время, что, безусловно, является очень важной проблемой для крупных транзакционных приложений с большим числом пользователей.

-- Курсор Transact-SQL
CREATE PROC SQL_Cursor
AS
/*Локальные переменные */
DECLARE @ContName VARCHAR(100),
     @CompName VARCHAR(50)
/*создаем курсор*/
DECLARE MyCursor CURSOR FOR
     SELECT CompanyName, ContactName
     FROM Suppliers
     WHERE ContactName LIKE 'c%'
/*открываем курсор*/
OPEN MyCursor
/*получить значения строки*/
FETCH MyCursor INTO @CompName, @ContName
/*выполнить операции с отдельной строкой */
PRINT 'T_SQL cursor row | ' + @ContName + ' | ' + @CompName
/*цикл*/
WHILE @@FETCH_STATUS = 0
BEGIN
/*поулчить значения строки*/
FETCH MyCursor INTO @CompName, @ContName
/*выполнить операции с отдельной строкой*/
PRINT 'T_SQL cursor row | ' + @ContName + ' | ' + @CompName
END
/*закрываем курсор*/
CLOSE MyCursor
/*удаляем описание курсора*/
DEALLOCATE MyCursor

-- Имитатор курсора
CREATE PROC CursorSimulator
AS
/*Подготовить табличную переменную для получения результирующего набора*/
DECLARE @tbl TABLE(
     RowID INT IDENTITY(1, 1),
     CompanyName VARCHAR(100),
     ContactName VARCHAR(50))
/*Локальные переменные*/
DECLARE @ContName VARCHAR(100),
     @CompName VARCHAR(50),
     @count int, /*создаем локальный @@fetch_status*/
     @iRow int /*указатель строки (индекс)*/
/* создаем имититор массива */
INSERT @tbl
SELECT CompanyName, ContactName
FROM Suppliers
WHERE ContactName LIKE 'c%'
/*получаем верхнюю границу массива (наибольший номер ID)*/
SET @count = @@ROWCOUNT
/*инициализация счетчика индекса */
SET @iRow = 1
/*цикл*/
WHILE @iRow <= @count
BEGIN
/*получить значения строки*/
SELECT @ContName = CompanyName, @CompName = ContactName
FROM @tbl
WHERE RowID = @iRow
/*выполнить операции с отдельной строкой*/
PRINT 'My cursor row | ' + @ContName + ' | ' + @CompName
/*перейти к следующей строке*/
SET @iRow = @iRow + 1
END

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

2005

Полезная информация

Конкурс

§ Мы выставили наш сайт на конкурс Интернить 2005. Победитель определяется числом поданых голосов. Просьба проголосовать. (рекомендуемая оценка 3 :-)).

Контакты

По всем вопросам, связанным с функционированием сайта, проблемами при решении упражнений, идеями вы можете обращаться к Сергею И.Моисеенко msi77@yandex.ru. Вы также можете предложить свои задачи для публикации на сайте.

Подписка Subscribe.Ru
Новости сайта "Упражнения по SQL"

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.db.sqlex
Отписаться
Вспомнить пароль

В избранное