Transact-SQL

Поделись знанием:
(перенаправлено с «T-SQL»)
Перейти к: навигация, поиск

Transact-SQL (T-SQL) — процедурное расширение языка SQL, созданное компанией Microsoft (для Microsoft SQL Server) и Sybase (для Sybase ASE).

SQL был расширен такими дополнительными возможностями как:

  • управляющие операторы,
  • локальные и глобальные переменные,
  • различные дополнительные функции для обработки строк, дат, математики и т. п.,
  • поддержка аутентификации Microsoft Windows.

Язык Transact-SQL является ключом к использованию MS SQL Server. Все приложения, взаимодействующие с экземпляром MS SQL Server, независимо от их реализации и пользовательского интерфейса, отправляют серверу инструкции Transact-SQL.





Элементы синтаксиса

Директивы сценария

Директивы сценария — это специфические команды, которые используются только в MS SQL. Эти команды помогают серверу определять правила работы со скриптом и транзакциями. Типичные представители: GO — информирует программы SQL Server об окончании пакета инструкций Transact-SQL, EXEC (или EXECUTE) — выполняет процедуру или скалярную функцию.

Комментарии

Комментарии используются для создания пояснений для блоков сценариев, а также для временного отключения команд при отладке скрипта. Комментарии бывают как строковыми, так и блоковыми:

-- — строковый комментарий исключает из выполнения только одну строку, перед которой стоят два минуса.

/* */ — блоковый комментарий исключает из выполнения целый блок команд, заключённый в указанную конструкцию. Допускает вложенные комментарии.

Типы данных

Как и в языках программирования, в SQL существуют различные типы данных для хранения переменных:

  • Числа — для хранения числовых переменных (bit, int, tinyint, smallint, bigint, numeric, decimal, money, smallmoney, float, real).
  • Даты — для хранения даты и времени (datetime, smalldatetime, date, time, datetime2, datetimeoffset).
  • Символы — для хранения символьных данных (char, nchar, varchar, nvarchar).
  • Двоичные — для хранения бинарных данных (binary, varbinary).
  • Большеобъемные — типы данных для хранения больших бинарных данных (text, ntext, image).
  • Специальные — указатели (cursor), 16-байтовое шестнадцатеричное число, которое используется для GUID (uniqueidentifier), штамп изменения строки (timestamp), версия строки (rowversion), таблицы (table).

Примечание. Для использования русских символов (не ASCII кодировки) используются типы данных с приставкой «n» (nchar, nvarchar, ntext), которые кодируют символы двумя байтами. Иначе говоря, для работы с Unicode используются типы данных с «n» (от слова national). Строковые константы с Unicode также записываются с «n» в начале.

Примечание. Для данных переменной длины используются типы данных с приставкой «var». Типы данных без приставки «var» имеют фиксированную длину области памяти, неиспользованная часть которой заполняется пробелами или нулями.

Идентификаторы

Идентификаторы — это специальные символы, которые используются с переменными для идентифицирования их типа или для группировки слов в переменную. Типы идентификаторов:

  • @ — идентификатор локальной переменной (пользовательской).
  • @@ — идентификатор глобальной переменной (встроенной).
  • # — идентификатор локальной таблицы или процедуры.
  • ## — идентификатор глобальной таблицы или процедуры.
  • [ ] — идентификатор группировки слов в переменную (работают как стандартные " ").

Переменные

Переменные используются в сценариях и для хранения временных данных. Чтобы работать с переменной, её нужно объявить, при том объявление должно быть осуществлено в той транзакции и пакете инструкций, в которой выполняется команда, использующая эту переменную. Иначе говоря, после завершения транзакции, а также после команды GO, переменная уничтожается.

Объявление переменной выполняется командой DECLARE, задание значения переменной осуществляется либо командой SET, либо SELECT:

USE TestDatabase
-- Объявление переменных
DECLARE @EmpID int, @EmpName varchar(40)
-- Задание значения переменной @EmpID
SET @EmpID = 1
-- Задание значения переменной @EmpName
SELECT @EmpName = UserName FROM Users WHERE UserID = @EmpID
-- Вывод переменной @EmpName в результат запроса
SELECT @EmpName AS [Employee Name]
GO

Примечание. В этом примере используется группировка слов в лексему — конструкция [Employee Name] воспринимается как одна лексема, так как слова заключены в квадратные скобки.

Операторы

Операторы — это специальные команды, предназначенные для выполнения простых операций над переменными:

  • Арифметические операторы: «*» — умножить, «/» — делить, «%» — остаток от деления, «+» — сложить, «-» — вычесть, «()» — скобки.
  • Операторы сравнения: «=» — равно, «>» — больше, «<» — меньше, «>=» — больше или равно, «<=» меньше или равно, «<>» («!=») — не равно, between (вместо «>», «<»).
  • Операторы соединения: «+» — соединение (конкатенация) строк.
  • Логические операторы: «AND» — и, «OR» — или, «NOT» — не.
  • Операторы со множествами: «IN».

Системные функции

Спецификация Transact-SQL значительно расширяет стандартные возможности SQL благодаря встроенным функциям:

  • Агрегативные функции — функции, которые работают с коллекциями значений и выдают одно значение. Типичные представители: AVG — среднее значение колонки, SUM — сумма колонки, MAX — максимальное значение колонки, COUNT — количество элементов колонки.
  • Скалярные функции — это функции, которые возвращают одно значение, работая со скалярными данными или вообще без входных данных. Типичные представители: DATEDIFF — разница между датами, ABS — модуль числа, DB_NAME — имя базы данных, USER_NAME — имя текущего пользователя, LEFT — часть строки слева.
  • Функции-указатели — функции, которые используются как ссылки на другие данные. Типичные представители: OPENXML — указатель на источник данных в виде XML-структуры, OPENQUERY — указатель на источник данных в виде другого запроса.

Примечание. Полный список функций можно найти в справке к SQL серверу.

Примечание. К скалярным функциям можно также отнести и глобальные переменные, которые в тексте сценария вызываются двойной собакой «@@».

Пример:

USE TestDatabase
-- Использование агрегативной функции для подсчета средней зарплаты
SELECT AVG(BaseSalary) AS [Average salary] FROM Positions
GO
-- Использование скалярной функции для получения имени базы данных
SELECT DB_NAME() AS [Database name]
GO
-- Использование скалярной функции для получения имени текущего пользователя
DECLARE @MyUser char(30)
SET @MyUser = USER_NAME()
SELECT 'The current user''s database username is: '+ @MyUser
GO
-- Использование функции-указателя для получения данных с другого сервера
SELECT * FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM owner.titles')
GO

Выражения

Выражение — это комбинация символов и операторов, которая получает на вход скалярную величину, а на выходе дает другую величину или исполняет какое-то действие. В Transact-SQL выражения делятся на 3 типа: DDL, DCL и DML.

  • DDL (Data Definition Language) — используются для создания объектов в базе данных. Основные представители данного класса: CREATE — создание объектов, ALTER — изменение объектов, DROP — удаление объектов.
  • DCL (Data Control Language) — предназначены для назначения прав на объекты базы данных. Основные представители данного класса: GRANT — разрешение на объект, DENY — запрет на объект, REVOKE — отмена разрешений и запретов на объект.
  • DML (Data Manipulation Language) — используются для запросов и изменения данных. Основные представители данного класса: SELECT — выборка данных, INSERT — вставка данных, UPDATE — изменение данных, DELETE — удаление данных.

Пример:

USE TestDatabase
-- Использование DDL
CREATE TABLE TempUsers (UserID int, UserName nvarchar(40), DepartmentID int)
GO
-- Использование DCL
GRANT SELECT ON Users TO public
GO
-- Использование DML
SELECT UserID, UserName + ' ' + UserSurname AS [User Full Name] FROM Users
GO
-- Использование DDL
DROP TABLE TempUsers
GO

Управление выполнением сценария

В Transact-SQL существуют специальные команды, которые позволяют управлять потоком выполнения сценария, прерывая его или направляя в нужную ветвь.

  • Блок группировки — структура, объединяющая список выражений в один логический блок (BEGIN … END).
  • Блок условия — структура, проверяющая выполнения определённого условия (IF … ELSE).
  • Блок цикла — структура, организующая повторение выполнения логического блока (WHILE … BREAK … CONTINUE).
  • Переход — команда, выполняющая переход потока выполнения сценария на указанную метку (GOTO).
  • Задержка — команда, задерживающая выполнение сценария (WAITFOR).
  • Вызов ошибки — команда, генерирующая ошибку выполнения сценария (RAISERROR).

Напишите отзыв о статье "Transact-SQL"

Литература

  • Майк Гандерлой, Джозеф Джорден, Дейвид Чанц. Часть II. Язык программирования Transact-SQL // Освоение Microsoft SQL Server 2005 = Mastering Microsoft SQL Server 2005. — М.: «Диалектика», 2007. — С. 139-280. — ISBN 0-7821-4380-6.
  • Роберт Виейра. Глава 3. Основные сведения о языке T-SQL // Программирование баз данных MS SQL Server 2005 для профессионалов = Professional Microsoft SQL Server 2005 Programming. — М.: «Диалектика», 2007. — С. 86-129. — 1072 с. — ISBN 978-5-8459-1329-6.
  • Виталий Бочкарёв. [www.sysengineering.ru/Administration/TransactSQL.aspx Просто о Transact-SQL] (рус.) (25 января 2010). [www.webcitation.org/65SFiAlTe Архивировано из первоисточника 15 февраля 2012].
  • Microsoft Corporation. [www.microsoft.com/learning/en/us/course.aspx?ID=2071B Курс MS-2071 "Создание запросов в Microsoft SQL Server 2000 с использованием Transact-SQL"] (англ.) (13 октября 2004). [www.webcitation.org/65SFjK8zd Архивировано из первоисточника 15 февраля 2012].


Отрывок, характеризующий Transact-SQL

– Выслали два полка наших в цепь, там нынче такой кутеж идет, беда! Две музыки, три хора песенников.
Офицер поехал за цепь к Ечкину. Издалека еще, подъезжая к дому, он услыхал дружные, веселые звуки плясовой солдатской песни.
«Во олузя а ах… во олузях!..» – с присвистом и с торбаном слышалось ему, изредка заглушаемое криком голосов. Офицеру и весело стало на душе от этих звуков, но вместе с тем и страшно за то, что он виноват, так долго не передав важного, порученного ему приказания. Был уже девятый час. Он слез с лошади и вошел на крыльцо и в переднюю большого, сохранившегося в целости помещичьего дома, находившегося между русских и французов. В буфетной и в передней суетились лакеи с винами и яствами. Под окнами стояли песенники. Офицера ввели в дверь, и он увидал вдруг всех вместе важнейших генералов армии, в том числе и большую, заметную фигуру Ермолова. Все генералы были в расстегнутых сюртуках, с красными, оживленными лицами и громко смеялись, стоя полукругом. В середине залы красивый невысокий генерал с красным лицом бойко и ловко выделывал трепака.
– Ха, ха, ха! Ай да Николай Иванович! ха, ха, ха!..
Офицер чувствовал, что, входя в эту минуту с важным приказанием, он делается вдвойне виноват, и он хотел подождать; но один из генералов увидал его и, узнав, зачем он, сказал Ермолову. Ермолов с нахмуренным лицом вышел к офицеру и, выслушав, взял от него бумагу, ничего не сказав ему.
– Ты думаешь, это нечаянно он уехал? – сказал в этот вечер штабный товарищ кавалергардскому офицеру про Ермолова. – Это штуки, это все нарочно. Коновницына подкатить. Посмотри, завтра каша какая будет!


На другой день, рано утром, дряхлый Кутузов встал, помолился богу, оделся и с неприятным сознанием того, что он должен руководить сражением, которого он не одобрял, сел в коляску и выехал из Леташевки, в пяти верстах позади Тарутина, к тому месту, где должны были быть собраны наступающие колонны. Кутузов ехал, засыпая и просыпаясь и прислушиваясь, нет ли справа выстрелов, не начиналось ли дело? Но все еще было тихо. Только начинался рассвет сырого и пасмурного осеннего дня. Подъезжая к Тарутину, Кутузов заметил кавалеристов, ведших на водопой лошадей через дорогу, по которой ехала коляска. Кутузов присмотрелся к ним, остановил коляску и спросил, какого полка? Кавалеристы были из той колонны, которая должна была быть уже далеко впереди в засаде. «Ошибка, может быть», – подумал старый главнокомандующий. Но, проехав еще дальше, Кутузов увидал пехотные полки, ружья в козлах, солдат за кашей и с дровами, в подштанниках. Позвали офицера. Офицер доложил, что никакого приказания о выступлении не было.
– Как не бы… – начал Кутузов, но тотчас же замолчал и приказал позвать к себе старшего офицера. Вылезши из коляски, опустив голову и тяжело дыша, молча ожидая, ходил он взад и вперед. Когда явился потребованный офицер генерального штаба Эйхен, Кутузов побагровел не оттого, что этот офицер был виною ошибки, но оттого, что он был достойный предмет для выражения гнева. И, трясясь, задыхаясь, старый человек, придя в то состояние бешенства, в которое он в состоянии был приходить, когда валялся по земле от гнева, он напустился на Эйхена, угрожая руками, крича и ругаясь площадными словами. Другой подвернувшийся, капитан Брозин, ни в чем не виноватый, потерпел ту же участь.
– Это что за каналья еще? Расстрелять мерзавцев! – хрипло кричал он, махая руками и шатаясь. Он испытывал физическое страдание. Он, главнокомандующий, светлейший, которого все уверяют, что никто никогда не имел в России такой власти, как он, он поставлен в это положение – поднят на смех перед всей армией. «Напрасно так хлопотал молиться об нынешнем дне, напрасно не спал ночь и все обдумывал! – думал он о самом себе. – Когда был мальчишкой офицером, никто бы не смел так надсмеяться надо мной… А теперь!» Он испытывал физическое страдание, как от телесного наказания, и не мог не выражать его гневными и страдальческими криками; но скоро силы его ослабели, и он, оглядываясь, чувствуя, что он много наговорил нехорошего, сел в коляску и молча уехал назад.
Излившийся гнев уже не возвращался более, и Кутузов, слабо мигая глазами, выслушивал оправдания и слова защиты (Ермолов сам не являлся к нему до другого дня) и настояния Бенигсена, Коновницына и Толя о том, чтобы то же неудавшееся движение сделать на другой день. И Кутузов должен был опять согласиться.


На другой день войска с вечера собрались в назначенных местах и ночью выступили. Была осенняя ночь с черно лиловатыми тучами, но без дождя. Земля была влажна, но грязи не было, и войска шли без шума, только слабо слышно было изредка бренчанье артиллерии. Запретили разговаривать громко, курить трубки, высекать огонь; лошадей удерживали от ржания. Таинственность предприятия увеличивала его привлекательность. Люди шли весело. Некоторые колонны остановились, поставили ружья в козлы и улеглись на холодной земле, полагая, что они пришли туда, куда надо было; некоторые (большинство) колонны шли целую ночь и, очевидно, зашли не туда, куда им надо было.
Граф Орлов Денисов с казаками (самый незначительный отряд из всех других) один попал на свое место и в свое время. Отряд этот остановился у крайней опушки леса, на тропинке из деревни Стромиловой в Дмитровское.
Перед зарею задремавшего графа Орлова разбудили. Привели перебежчика из французского лагеря. Это был польский унтер офицер корпуса Понятовского. Унтер офицер этот по польски объяснил, что он перебежал потому, что его обидели по службе, что ему давно бы пора быть офицером, что он храбрее всех и потому бросил их и хочет их наказать. Он говорил, что Мюрат ночует в версте от них и что, ежели ему дадут сто человек конвою, он живьем возьмет его. Граф Орлов Денисов посоветовался с своими товарищами. Предложение было слишком лестно, чтобы отказаться. Все вызывались ехать, все советовали попытаться. После многих споров и соображений генерал майор Греков с двумя казачьими полками решился ехать с унтер офицером.
– Ну помни же, – сказал граф Орлов Денисов унтер офицеру, отпуская его, – в случае ты соврал, я тебя велю повесить, как собаку, а правда – сто червонцев.
Унтер офицер с решительным видом не отвечал на эти слова, сел верхом и поехал с быстро собравшимся Грековым. Они скрылись в лесу. Граф Орлов, пожимаясь от свежести начинавшего брезжить утра, взволнованный тем, что им затеяно на свою ответственность, проводив Грекова, вышел из леса и стал оглядывать неприятельский лагерь, видневшийся теперь обманчиво в свете начинавшегося утра и догоравших костров. Справа от графа Орлова Денисова, по открытому склону, должны были показаться наши колонны. Граф Орлов глядел туда; но несмотря на то, что издалека они были бы заметны, колонн этих не было видно. Во французском лагере, как показалось графу Орлову Денисову, и в особенности по словам его очень зоркого адъютанта, начинали шевелиться.
– Ах, право, поздно, – сказал граф Орлов, поглядев на лагерь. Ему вдруг, как это часто бывает, после того как человека, которому мы поверим, нет больше перед глазами, ему вдруг совершенно ясно и очевидно стало, что унтер офицер этот обманщик, что он наврал и только испортит все дело атаки отсутствием этих двух полков, которых он заведет бог знает куда. Можно ли из такой массы войск выхватить главнокомандующего?
– Право, он врет, этот шельма, – сказал граф.
– Можно воротить, – сказал один из свиты, который почувствовал так же, как и граф Орлов Денисов, недоверие к предприятию, когда посмотрел на лагерь.
– А? Право?.. как вы думаете, или оставить? Или нет?
– Прикажете воротить?
– Воротить, воротить! – вдруг решительно сказал граф Орлов, глядя на часы, – поздно будет, совсем светло.
И адъютант поскакал лесом за Грековым. Когда Греков вернулся, граф Орлов Денисов, взволнованный и этой отмененной попыткой, и тщетным ожиданием пехотных колонн, которые все не показывались, и близостью неприятеля (все люди его отряда испытывали то же), решил наступать.
Шепотом прокомандовал он: «Садись!» Распределились, перекрестились…
– С богом!
«Урааааа!» – зашумело по лесу, и, одна сотня за другой, как из мешка высыпаясь, полетели весело казаки с своими дротиками наперевес, через ручей к лагерю.
Один отчаянный, испуганный крик первого увидавшего казаков француза – и все, что было в лагере, неодетое, спросонков бросило пушки, ружья, лошадей и побежало куда попало.