- •Лекция 3. Общие сведения о Transact-sql
- •Общие сведения о Transact-sql
- •Типы данных
- •Переменные в Transact-sql
- •Конструкция case
- •Функции Transact-sql
- •Скалярные функции
- •Циклическая конструкция
- •Конструкция waitfor
- •Блок try/catch
- •Комментарии
- •Математические функции
- •Строковые функции
- •Функции для работы с датами
- •Конфигурационные функции
- •Системные функции
- •Отладка кода в Management Studio
Переменные в Transact-sql
Любой объект базы данных должен обладать уникальным именем внутри этой базы. На основе имени происходит обращение к этому объекту. Имена объектов называются идентификаторами. Transact-SQL накладывает ряд ограничений на порядок именования объектов:
первый символ имени должен быть одним из символов латинского алфавита (A-Z, a-z), либо символом @, # или _, т.е. не допускается использование цифр и прочих специальных символов. Остальная часть имени может включать любые символы алфавита, цифры и некоторые специальные символы;
общая длина имени обычного объекта не должна превышать 128 символов, для временных объектов – 116;
внутри имени запрещается использование пробелов, скобок и таких символов, как ~, !, %, ^, & и др.
имя объекта не должно совпадать с зарезервированным словом и с именем уже существующего объекта;
если имя объекта содержит пробелы или совпадает с зарезервированным словом, то его необходимо поместить внутрь квадратных скобок [ ].
Замечание: Transact-SQL является CASE-нечувствительным языком, т.е. не различает регистра символов.
Имена локальных переменных должны удовлетворять перечисленным правилам именования объектов и всегда должны начинаться с символа @. Область действия переменной ограничена пакетом операторов или процедурой, в которой она была объявлена.
Объявление переменной
Синтаксис команды (внутри квадратных скобок в описании синтаксиса располагаются необязательные элементы):
DECLARE @ИмяПеременной ТипДанных [ ,…n]
Пример объявления одной переменной:
DECLARE @sum int
Пример объявления нескольких переменных:
DECLARE @temp int, @count float
Присвоение значения
Синтаксис команды:
SET @ИмяПеременной = Выражение
Пример присвоения значения:
SET @sum = 0
В версии MS SQL Server 2008 появились следующие нововведения.
Инициализировать переменную стало можно сразу при объявлении, например:
DECLARE @iCounter int = 0
Появились операторы +=, –=, *=, /= для краткой формы записи арифметических конструкций.
Управляющие конструкции Transact-SQL
Группировка команд
Группировка двух и более команд в единый блок осуществляется с помощью конструкции:
BEGIN
...
END
Такая группировка используется в условных и циклических конструкциях.
Конструкция ветвления
Выполнение той или иной группы команд в зависимости от выполнения или не выполнения некоторого условия реализуется с помощью конструкции:
IF <условие>
Оператор
[ELSE
Оператор ]
При отсутствии команд, выполняемых при несоблюдении условия, ключевое слово ELSE можно не указывать.
Следует отметить особенность проверки значений на NULL (специальный маркер, обозначающий отсутствие информации). Вместо обычного сравнения: IF @myvar = NULL, следует использовать оператор IS: IF @myvar IS NULL.
Конструкция case
Аналогична оператору CASE в языках программирования. В MS SQL Server 2008 оператор CASE имеет два возможных варианта использования.
С входным выражением:
CASE <входное выражение>
WHEN <выражение when > THEN <результат>
[...]
[ELSE <результат>]
END
Пример:
SELECT TOP 10 SalesOrderID, SalesOrderID % 10 AS ‘Last Digit’, Position = CASE SalesOrderID % 10
WHEN 1 THEN ‘Один’
WHEN 2 THEN ‘Два’
WHEN 3 THEN ‘Три’
WHEN 4 THEN ‘Четыре’
ELSE ‘Другое’
END
FROM Sales.SalesOrderHeader;
Результат запроса представлен на рис. 3.1.
Рис. 3.1. Результат использования оператора CASE
Без входного выражения:
CASE
WHEN <логическое выражение> THEN <результат>
[...]
[ELSE <результат>]
END
Используется, как правило, для поиска.
Пример:
SELECT TOP 10 SalesOrderID % 10 AS 'OrderLastDigit',
ProductID % 10 AS 'ProductLastDigit',
"How Close?" = CASE
WHEN (SalesOrderID % 10) < 3 THEN 'Меньше трёх'
WHEN ProductID = 6 THEN 'ProductID равен 6'
WHEN ABS(SalesOrderID % 10 - ProductID) <= 1 THEN ' В пределах одного'
ELSE 'Больше одного'
END
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderID DESC;
Результат выполнения запроса представлен на рис. 3.2.
Рис. 3.2. Результат использования оператора CASE
