Главная » Файлы » Разное » Учеба |
Общие сведения о Transact-SQL
[ Скачать с сервера (136.5 Kb) ] | 12.12.2012, 00:33 |
Лекция 3. Общие сведения о Transact-SQL В лекции рассматриваются основные типы данных, используемые в MS SQL Server 2008, правила объявления переменных, а также алгоритмические конструкции, присущие всем языкам программирования, и стандартные функции для обработки данных. Цель: дать представление об основных возможностях языка Transact-SQL. Общие сведения о Transact-SQL В 1970-х годах был разработан специальный язык SEQUEL (Structured English Query Language), который позднее был переименован в SQL. В 1986 году комитетом ANSI (American National Standards Institute) был принят первый стандарт языка. Последним принятым стандартом является ISO SQL:2008. Язык SQL разрабатывался как непроцедурный язык, который будет доступен обычным пользователям, а не только программистам. Однако со временем язык становился все сложнее и сейчас предназначен в большей степени для программистов. Несмотря на существование стандартов языка SQL, в каждой СУБД используется свое расширение этого языка. Основной причиной использования расширений SQL является потребность применять SQL не только как язык запросов, но и как язык программирования, для этого, как правило, вводятся так называемые хранимые процедуры. СУБД Microsoft SQL Server использует свое расширение языка, которое называется Transact-SQL и включает в себя следующее: • управляющие конструкции; • локальные переменные; • дополнительные функции (математические, строковые и другие); • поддержка аутентификации Windows. Типы данных MS SQL Server поддерживает все основные простые типы данных, используемые в современных языках программирования. В версии MS SQL Server 2008 были добавлены несколько новых типов, а некоторые перестали рекомендоваться к использованию. Типы данных в MS SQL Server можно разделить на семь категорий. 1. Целые числа: • Bit (1 байт). На самом деле первый бит в таблице будет занимать один байт, однако следующие семь бит в этой таблице будут храниться в том же байте. • Bigint (8 байт). 64-разрядное целое число, позволяет хранить числа от –263 до +263–1. • Int (4 байта). Диапазон значений от –2 147 483 648 до +2 147 483 647. • SmallInt (2 байта). Диапазон значений от –32768 до +32767. • TinyInt (1 байт). Диапазон значений от 0 до 255. 2. Числа с фиксированной запятой: • Decimal или Numeric. Диапазон значений от –1038–1 до +1038–1. • Money (8 байт). Денежный формат, диапазон значений от –263 до +263 с четырьмя знаками после запятой. • SmallMoney (4 байта). Денежный формат, диапазон значений от –214748,3648 до +214748,3647. 3. Числа с плавающей запятой: • Float. Диапазон значений от –1,79E +308 до +1,79E +308. 4. Дата и время: • DateTime (8 байт). Диапазон значений от 1 января 1753 года до 31 декабря 9999 года с точностью до трех сотых секунды. • DateTime2 (6-8 байт). Новый тип данных, поддерживает точность до 0,1 мс. • SmallDateTime (4 байта). Диапазон значений от 1 января 1900 года до 6 июня 2079 года с точностью одна минута. • DateTimeOffset (8-10 байт). Аналогичен типу DateTime, но хранит ещё сдвиг относительно времени UTC. • Date (3 байта). Хранит только дату. Диапазон значений от 1 января 0001 года до 31 декабря 9999 года. • Time (3-5 байт). Хранит только время с точностью до 0,1 мс. 5. Символьные строки: • Char. Строка фиксированной длины. Максимальная длина строки 8000 символов. • VarChar. Строка переменной длины. Максимальная длина строки 8000, но при использовании ключевого слова «max» может хранить до 231 байт. • Text. Применялся для хранения больших строк, сейчас рекомендуется использование varchar(max) вместо text. Оставлен для обратной совместимости. • Nchar. Строка фиксированной длины в Юникоде. Максимальная длина строки 4000 символов. • NvarChar. Строка переменной длины в Юникоде. Максимальная длина строки 4000 символов, но при использовании ключевого слова «max» может хранить до 231 байт. • Ntext. Аналогичен типу text, но предназначен для работы с Юникод. Сейчас рекомендуется использовать nvarchar(max). Оставлен для обратной совместимости. 6. Двоичные данные: • Binary. Позволяет хранить двоичные данные размером до 8000 байт. • VarBinary. Тип данных переменной длины, позволяет хранить до 8000 байт, но при использовании ключевого слова «max» до 231 байт. • Image. Использовался для хранения больших объемов данных, сейчас рекомендуется использовать varbinary(max). Оставлен для обратной совместимости. 7. Прочие типы данных: • Table. Особый тип данных, используемый в основном для временного хранения таблиц и для передачи в качестве параметра в функции. • HierarchyID. Используется для представления положения в иерархической структуре. • Sql_variant. Тип данных, хранящий значения различных типов данных, поддерживаемых MS SQL Server. • XML. Позволяет хранить XML-данные. • Cursor (1 байт). Тип данных для переменных или выходных параметров хранимых процедур, которые содержат ссылку на курсор. • Timestamp / rowversion (8 байт). Это тип данных, который представляет собой автоматически сформированные уникальные двоичные числа в базе данных. Значение данного типа генерируется БД автоматически при вставке или изменении записи. • UniqueIdentifier (16 байт). Представляет собой GUID (Special Globally Unique Identifier). Гарантируется уникальность данного значения. Переменные в 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 имеет два возможных варианта использования. 1. С входным выражением: 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 2. Без входного выражения: 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 Циклическая конструкция Transact-SQL поддерживает единственный тип цикла – цикл WHILE, синтаксис которого следующий: WHILE условие Оператор [BREAK | CONTINUE] Замечание. Вертикальная черта в описании синтаксиса означает «или», т.е. в данном примере может быть указан либо BREAK, либо CONTINUE. Тело цикла выполняется до тех пор, пока условие истинно. Цикл можно принудительно остановить, если выполнить в теле цикла команду BREAK. Если же нужно начать цикл заново, не дожидаясь выполнения команд тела цикла, необходимо выполнить команду CONTINUE. Конструкция WAITFOR В некоторых случаях требуется отложить выполнение той или иной команды. Для этих целей можно воспользоваться оператором WAITFOR. Эта команда имеет следующий синтаксис: WAITFOR DELAY <’time’> | TIME <’time’> Если используется параметр DELAY, то указывается, сколько времени необходимо ждать MS SQL Server. Максимально возможная задержка – 24 часа. Пример использования: WAITFOR DELAY ‘01:00’, который приостановит выполнение на один час. Если используется параметр TIME, то исполнение будет приостановлено до наступления заданного времени. Пример использования: WAITFOR TIME ‘01:00’ – приостановление выполнения кода до наступления часа ночи. Блок TRY/CATCH Данную конструкцию можно использовать для обработки исключительных ситуаций. Впервые это конструкция появилась в MS SQL Server 2005. Блок TRY/CATCH в MS SQL Server работает также как и в других языках программирования. Используется следующий синтаксис: BEGIN TRY { <выражения SQL> } END TRY BEGIN CATCH { <выражения SQL> } END CATCH [ ; ] В блоке BEGIN TRY... END TRY выполняются потенциально опасные команды, если при этом произойдет ошибка уровня 11-19, то выполнение будет передано в блок CATCH. Уровни ошибок: • 1–10 Информационные сообщения. Например, обнаружение NULL значений при выполнении агрегатных функций. Так как управление в блок CATCH данные ошибки не передают, то для получения информации об ошибки можно использовать функцию @@ERROR. • 11–19 Относительно серьезные ошибки. Например, нарушение ограничений внешнего ключа. • 20–25 Очень серьезные ошибки. Это ошибки на уровне системы, поэтому в коде нельзя узнать о ее возникновении. Такие ошибки разрывают текущее соединение и прерывают выполнение команд. Комментарии Существует два вида комментариев: • однострочные – в этом случае игнорируется текст справа от символов комментария: -- (двойной дефис); • многострочные – игнорируется текст, записанный между двумя парами символов: /* … */. Функции Transact-SQL MS SQL Server имеет ряд встроенных функций для облегчения и ускорения обработки данных. Различают три типа функций: • функции наборов записей – результатом выполнения является объект, который может быть использован как таблица данных; • агрегатные функции – результатом является единственное значение заданного атрибута из некоторого множества записей; • скалярные функции – результатом также является одно значение из строго определенного набора аргументов. Скалярные функции Выделяют следующие категории скалярных функций – математические, строковые, для работы с датами, конфигурационные и системные. Рассмотрим каждую категорию. Математические функции Большинство математических функций возвращают результат того же типа, что и исходные значения. Например, при переводе величины угла из градусов в радианы в случае Radians(90) результат равен 1, что неверно, так как в качестве аргумента функции использовано целое число. Правильная запись: Radians (90.0). Abs (выражение) – вычисление абсолютного значения выражения. Можно использовать как целочисленные, так и нецелочисленные величины. IsNumeric (выражение) – проверка, имеет ли указанное выражение числовой тип данных. Результат равен 1, если выражение имеет числовой тип, иначе – 0. Rand () – возвращает случайное значение на основе системного времени в диапазоне от 0 до 1. Floor (выражение) – округление указанного значения до ближайшего минимального целого числа. Ceiling (выражение) – возвращает ближайшее целое число, большее или равное данному. Power (выражение, степень) – возведение в степень выражения. Тип возвращаемого значения совпадает с исходным типом. Sqrt (выражение) – вычисляет квадратный корень. Строковые функции Ascii (строка) – возвращает ASCII-код самого левого символа строки. Char (выражение) – возвращает символ, ASCII-код которого соответствует указанному числовому выражению. Len (строка) – вычисляет длину строки в символах. LTrim (строка), RTrim (строка) – удаляют начальные и концевые пробелы соответственно. Left (строка, число), Right (строка, число) – возвращают указанное количество символов строки, начиная с левого и правого края строки соответственно. SubString (строка, начало, длина) – возвращает для строки подстроку указанной длины, начиная с указанного символа. CharIndex (строка1, строка2 [, старт]) – поиск подстроки строка1 в строке строка2. Возвращает порядковый номер первого символа, с которого начинается первое вхождение подстроки в строку. Дополнительно можно указать стартовую позицию, с которой будет начат поиск. Stuff (строка1, начало, длина, строка2) – удаляет определенное количество символов строки1, начиная с указанного, и заменяет их новой строкой2. Replace (строка1, строка2, строка3) – заменяет все вхождения строки строка2 в исходной строке строка1 на строка3. Reverse (строка) – возвращает строку, символы которой записаны в обратном порядке по отношению к исходной строке. Функции для работы с датами GetDate () – возвращает текущее системное время. IsDate (выражение) – проверяет правильность выражения на соответствие одному из возможных форматов ввода даты. Day (дата), Month(дата), Year(дата) – возвращают день, месяц и год из указанной даты. DateName (тип, дата) – выделяет из даты указанную в типе часть и возвращает ее в символьном формате. Формат частей: yy или yyyy – год, qq или q – квартал, mm или m – месяц, dd или d – день, wk или ww – неделя, hh – час, mi или m – минута, ss или s – секунда, ms – миллисекунда. DatePart (тип, дата) – выделяет из даты указанную часть и возвращает ее в числовом формате. DateAdd (тип, число, дата) – добавляет к указанной дате число, тип которого указан в первом параметре. DateDiff (тип, начало, окончание) – возвращает разницу между указанными частями дат в указанном типе. Конфигурационные функции Возвращают информацию о текущей конфигурации MS SQL Server. Например: @@Version – возвращает информацию о дате, версии и типе процессора сервера. @@ServerName – символьное имя локального MS SQL Server. @@Max_Connections – максимально разрешенное количество одновременных подключений к серверу. Системные функции Возвращают информацию о значениях, объектах и текущих параметрах MS SQL Server. DataLength(выражение) – возвращает число, соответствующее количеству байт, необходимых для хранения результата выражения. @@Error – код последней ошибки, произошедшей в текущем соединении. Если ошибок нет, результат равен 0. Host_Name() – символьное имя компьютера в сети, на котором выполняется команда. System_User и Session_User – возвращают соответственно имя учетной записи пользователя для входа и имя пользователя текущей базы данных. @@IDLE – определяет количество миллисекунд, прошедшее со времени последнего запуска MS SQL Server. NewID() – генерирует новое значение типа UniqueIdentifier. Permission ([ObjectID[, ‘column’]]) – возвращает информацию о правах доступа для текущего пользователя. Аргумент ObjectID указывает идентификационный номер объекта базы данных. Для получения идентификационного номера объекта по его имени используется функция Object_ID(‘имя’). Результатом данной функции является 32-битное значение, каждый бит которого соответствует тому или иному праву доступа. Если значение этого бита равно 1, то доступ к объекту разрешен. Определим, например, имеет ли пользователь право выборки данных из таблицы Product БД AdventureWorks2008: SELECT Permissions (object_id('production.product')) Если первый младший бит результата равен 1, то выборка данных из таблицы Product разрешена. Чтобы проверить право доступа к полю некоторой таблицы, необходимо указать идентификационный номер этой таблицы данных и в аргументе ‘column’ указать имя этого поля. Например, для проверки возможности выборки данных из поля Stor_id таблицы Sales необходимо: SELECT Permissions (object_id('production.product'),'ProductID') Если первый младший бит результата равен 1, то выборка данных из поля ProductID таблицы Product также разрешена. Отладка кода в Management Studio В MS SQL Server 2008 появилась возможность отлаживать SQL код при помощи пошагового выполнения. Для этого существуют команды Debug – Step Into (F11) и Debug – Step Over (F10). Команда Debug – Toggle Breakpoint (F9) устанавливает точку останову, до которой будет происходить выполнение кода. Во время отладки доступны такие окна: • Locals – автоматически содержит список всех локальных переменных и показывает их текущие значения; • Watch – позволяет вручную добавлять переменные для отслеживания их значений; • Callstack – показывает стек вызовов функций. Снимок экрана во время процесса отладки показан на рис. 3.3. Рис. 3.3. Окно отладки в Management Studio. Желтая стрелка указывает на текущую исполняемую строку; красный кружок – точка останова. Краткие итоги. Рассмотрены типы данных, доступные в MS SQL Server 2008. Продемонстрировано использование базовых алгоритмических конструкций и локальных переменных, а также показана возможность отладки SQL-кода. | |
Категория: Учеба | | |
Просмотров: 1057 | Загрузок: 161 |
Всего комментариев: 0 | |