Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование приложений баз данных с использованием СУБД MS SQL Server. Учебное пособие
.pdf
представление совсем не виртуально, а присутствует в памяти физически.
Примеры создания представления.
Пример 1.
Create view Hr.AuthS as select name from Author
Представление AuthS содержит только столбец name таблицы Author.
Пример 2.
create view dbo.un_book as
select isbn, title=cast(name as char(15))+case when len(name)>15
then '…' else '' end, publisher=izd from book where Mesto ='M.'
Содержание представления показано на рис. 7.
Рис. 7
20

2.5. Индексы
Индексы представляют собой набор ссылок на места физического размещения строк таблицы в файлах базы данных, упорядоченный по возрастанию или убыванию значений определенного
столбца или комбинации значений двух и более столбцов. Упорядоченность позволяет организовать быстрый поиск нужного значения, т. е. основное назначение индекса – ускорение процесса
выборки из таблицы
строк с определенным значением индексированного столбца. В индексе хранятся только значения индексированного столбца и указатели на соответствующие строки. Сам индекс содержится отдельно от таблицы в страницах файлов базы
данных, специально предназначенных для хранения индексов.
Индексы не следует создавать для столбцов, которые только выбираются, но не используются
в качестве критериев поиска или сортировки, или для объемных столбцов, длина которых достигает нескольких десятков байт. Кроме того, если изменения, затрагивающие индексированные столбцы, производятся чаще, чем выборка,
то индекс лучше не создавать совсем. Это связано с тем, что при
обновлении данных необходимо будет перестраивать индексы,
а это требует
дополнительных временных затрат.
СУБД поддерживает два типа индексов: кластерные и некластерные. Оба реализуются в виде сбалансированного дерева. Кластерный индекс представляет собой настоящую таблицу, нижний
уровень индекса содержит физические строки индексированной
таблицы. Некластерный индекс хранится отдельно от таблицы
и содержит только значения индексированных столбцов и указатели на строки.
Чтобы создать индекс, нужно воспользоваться следующей командой:
Create [clustered| nonclustered] index<имя индекса>
on<имя таблицы>(<имя столбца> [asc|desc] [,…n])
[on<имя группы файлов>]
Пример
Create nonclustered index Tindex1 on book (god desc)
В результате выполнения команды для таблицы book был создан
некластерный индекс по столбцу god, упорядоченный по убыванию
значений.
21

3. ЯЗЫК TRANSACT-SQL
3.1. Общие сведения о Transact-SQL
В 1970-х годах был разработан специальный язык SEQUEL
(Structured English Query Language), который позднее был переиме-
нован в SQL. В 1986 году комитетом ANSI (American National
Standards Institute) был принят первый стандарт языка. Последним
принятым стандартом является ISO SQL:2008.
Язык SQL разрабатывался как непроцедурный язык, который
будет доступен обычным пользователям, а не только программистам. Однако со временем язык становился все сложнее и сейчас
предназначен
в большей степени для программистов. Несмотря на
существование стандартов языка SQL, в каждой СУБД используется свое расширение этого языка. Основной причиной использования расширений SQL является потребность применять SQL не
только как язык запросов, но и как язык программирования. SQL
Server использует свое расширение языка, которое называется
Transact-SQL. С его помощью можно создавать программируемые
объекты базы данных трех типов:
хранимые процедуры;
функции;
триггеры.
3.2. Типы данных
В дополнение к типам данных, рассмотренным ранее и используемым при описании столбцов, Transact-SQL использует еще
и следующие типы данных:
Table. Особый тип данных, используемый в основном для
временного хранения таблиц и для передачи в качестве
параметра
в функции;
HierarchyID. Используется для представления положения
в иерархической структуре;
Sql_variant. Тип данных, хранящий значения различных ти-
пов данных, поддерживаемых MS SQL Server;
XML. Позволяет хранить XML-данные;
22

Cursor (1 байт). Тип данных для переменных или выходных
параметров хранимых процедур, которые содержат ссылку на курсор;
Timestamp / rowversion (8 байт). Это тип данных, который
представляет собой автоматически сформированные уникальные
двоичные числа в базе данных. Значение данного типа генерируется БД автоматически при вставке или изменении записи;
UniqueIdentifier (16 байт). Представляет собой GUID (Spe-
cial Globally Unique Identifier). Гарантируется уникальность данного
значения.
3.3. Переменные в Transact-SQL
Любой объект базы данных должен обладать уникальным
именем внутри этой базы. На основе имени происходит обращение
к этому объекту. Имена объектов называются идентификаторами.
Transact-SQL накладывает ряд ограничений на порядок именования
объектов:
первый символ имени должен быть одним из символов ла-
тинского алфавита
(A–Z, a–z) либо символом @, # или _, т. е. не
допускается использование цифр и прочих специальных символов.
Остальная часть имени может включать любые символы алфавита,
цифры и некоторые специальные символы;
общая длина имени обычного объекта не должна превы-
шать 128 символов, для временных объектов – 116;
внутри имени запрещается использование пробелов, скобок
и таких символов,
как ~, !, %, ^, & и др.
имя объекта не должно совпадать с зарезервированным сло-
вом и с именем уже существующего объекта;
если имя объекта содержит пробелы или совпадает с заре-
зервированным словом, то его необходимо поместить внутрь квадратных скобок [ ].
Замечание. Transact-SQL является CASE-нечувствительным
языком, т. е. не различает регистр символов.
Имена
локальных переменных должны удовлетворять пере-
численным правилам именования объектов и всегда должны начи-
23

наться с символа @. Область действия переменной ограничена пакетом операторов или процедурой, в которой она была объявлена.
Объявление переменной производится следующей командой:
DECLARE @<Имя Переменной><Тип Данных>[ ,…n]
Пример объявления одной переменной:
DECLARE @st nchar(9)
Пример объявления нескольких переменных:
DECLARE @temp int, @count float
3.4. Операторы языка Transact-SQL
3.4.1. Оператор присваивания
Синтаксис оператора присваивания:
SET @<Имя Переменной> = Выражение
Пример присвоения
значения:
SET @s = 0.54
Оператор select позволяет присваивать значения нескольким переменным одновременно:
declare @a int,@st nvarchar(40),@value1 float
Select @a=15,@st='business',@value1=price*ytd_sales from titles
where title_id='BU1032'
Последний пример демонстрирует возможность присвоения
результата подзапроса, если он возвращает единственное значение.
Можно инициализировать переменную сразу при объявлении,
например:
DECLARE @iCounter int = 0
24

3.4.2. Оператор вывода
Для вывода значений переменных можно использовать команду select или команду print. Первая из них выводит данные
в стандартный набор строк (recordset) и эти данные могут быть использованы в пользовательской программе.
Пример.
declare @a int,@st nvarchar(40),@value1 float
Select @a=15,@st='символьная
строка',@value1=price*ytd_sales from titles where title_id='BU1032'
Select s1=@a,s2=@st,s3=@value1
Первая команда select является оператором присваивания, вто-
рая – оператором вывода.
Результаты вывода можно увидеть на рис. 8. Здесь s1, s2, s3 –
наименования столбцов выведенной второй командой SELECT
таблицы, которая состоит из одной строки.
Рис. 8
25

Команда print выводит информацию в качестве служебной
и появляется во вкладке «Сообщения» (см. рис. 8).
Пример
Print @aa
3.4.3. Составной оператор
Группировка двух и более команд в единый блок осуществля-
ется с помощью конструкции:
BEGIN
...
END
Составной оператор используется в условных и циклических
конструкциях.
3.4.4. Условный оператор IF
Выполнение той или иной группы команд в зависимости
от выполнения или невыполнения некоторого условия реализуется
с помощью конструкции:
IF<условие>
Оператор
[ELSE
Оператор ]
При отсутствии команд, выполняемых при невыполнении условия, ключевое слово ELSE можно не указывать.
Следует отметить особенность проверки значений на NULL
(специальный маркер, обозначающий отсутствие информации).
Вместо обычного сравнения: IF @myvar = NULL,
следует исполь-
зовать оператор IS: IF @myvar IS NULL.
3.4.5. Функция CASE
Функция CASE в отличие от оператора IF может использоваться в запросах и имеет два возможных варианта использования.
26

Вариант 1 (с входным выражением):
CASE <входное выражение>
WHEN <выражение when> THEN <результат>
[...]
[ELSE <результат>]
END
В последующих примерах анализируются последние цифры
полей, содержащих числовые идентификаторы.
Пример:
SELECT TOP 10 GOD, GOD % 10 AS 'Last_Digit', Position = CASE
GOD % 10
WHEN 1 THEN 'Один'
WHEN 2 THEN 'Два'
WHEN 3 THEN 'Три'
WHEN 4 THEN 'Четыре'
ELSE 'Другое'
END
FROM book
Результат запроса представлен на рис. 9.
Рис. 9
Вариант 2 (без входного выражения).
Предыдущий вариант функции позволяет работать только со
строго перечисленными вариантами. Однако в ряде случаев необходимо получить значение на основании какого-либо логического
27

условия. Выходом является второй, так называемый «поисковый»,
вариант:
CASE
WHEN<логическое выражение>THEN<результат>
[...]
[ELSE <результат>]
END
Пример:
SELECT TOP 10 GOD, GOD % 10 AS 'Last_Digit', 'How_Close?' =
CASE
WHEN GOD % 10 < 3 THEN 'Меньше трех'
WHEN GOD % 10=6 THEN 'Равен шести'
WHEN GOD % 10 >6 THEN 'Больше шести'
ELSE 'Другое'
END
FROM book
Результат выполнения запроса представлен на рис. 10.
Рис. 10
3.4.6. Оператор цикла
Transact-SQL поддерживает единственный тип цикла – цикл
WHILE, синтаксис которого следующий:
WHILE условие
Оператор
[BREAK | CONTINUE]
28

Замечание. Вертикальная черта в описании синтаксиса означает «или», т. е. в данном примере может быть указано либо
BREAK, либо CONTINUE.
Тело цикла выполняется до тех пор, пока условие истинно.
Цикл можно принудительно остановить, если выполнить в теле
цикла команду BREAK. Если же нужно начать цикл заново, не дожидаясь выполнения команд
тела цикла, необходимо выполнить
команду CONTINUE.
3.4.7. Оператор WAITFOR
В некоторых случаях требуется отложить выполнение той или
иной команды. Для этих целей можно воспользоваться оператором
WAITFOR. Эта команда имеет следующий синтаксис:
WAITFOR DELAY <’time’> | TIME <’time’>
Если используется параметр DELAY, то указывается, сколько
времени необходимо ждать MS SQL Server. Максимально возможная задержка – 24 часа. Пример использования: WAITFOR DELAY
‘01:00’, который приостановит выполнение на один час.
Если используется параметр TIME, то исполнение будет
приостановлено до наступления заданного времени. Пример использования: WAITFOR TIME ‘01:00’ – приостановление выполнения кода до наступления часа ночи.
3.4.8. Блок TRY/CATCH
Данную конструкцию можно использовать для обработки ис-
ключительных ситуаций. Впервые эта конструкция появилась в MS
SQL Server 2005.
Блок TRY/CATCH в MS SQL Server работает так же, как
и в других языках программирования. Используется следующий
синтаксис:
29
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
