Transact-SQL
Transact-SQL (сокращённо T-SQL) — это процедурное расширение языка структурированных запросов SQL (Structured Query Language), разработанное корпорацией Microsoft и используемое в системах управления базами данных (СУБД) Microsoft SQL Server и Azure SQL Database. T-SQL добавляет к стандартному SQL возможности для написания сложной логики обработки данных, включая объявление переменных, управляющие конструкции (условные операторы, циклы), обработку ошибок и работу с транзакциями. Язык является основным средством взаимодействия с реляционными базами данных в экосистеме Microsoft.
История
Разработка Transact-SQL началась в середине 1980-х годов, когда Microsoft совместно с Sybase создавала первую версию SQL Server для OS/2. В основе лежал язык Sybase SQL, который был расширен и адаптирован для платформы Microsoft. После разрыва партнёрства в 1990-х годах Microsoft продолжила самостоятельное развитие SQL Server, и T-SQL стал его родным языком.
Первая версия Microsoft SQL Server (4.2) вышла в 1993 году и уже поддерживала базовые возможности T-SQL. С выходом SQL Server 7.0 (1998) язык получил значительные улучшения, включая поддержку курсоров, хранимых процедур и триггеров. В SQL Server 2000 была добавлена поддержка пользовательских функций. Версия SQL Server 2005 привнесла в T-SQL блоки обработки ошибок TRY...CATCH, оконные функции и обобщённые табличные выражения (CTE). Дальнейшие версии, вплоть до SQL Server 2022, продолжали расширять язык новыми функциями, такими как SEQUENCE, STRING_AGG, функциями работы с JSON и улучшенной поддержкой графовых данных.
Архитектура и синтаксис
Transact-SQL является процедурным языком, что отличает его от декларативного стандартного SQL. Программа на T-SQL состоит из последовательности операторов, которые могут быть сгруппированы в логические блоки — пакеты. Пакет — это одна или несколько инструкций T-SQL, отправляемых серверу для выполнения как единого целого.
Основные элементы
- Переменные: объявляются с помощью ключевого слова
DECLARE. Имена переменных начинаются с символа@. Поддерживаются локальные переменные (@имя) и глобальные системные переменные (@@имя, например,@@ROWCOUNT). - Управляющие конструкции: включают условные операторы
IF...ELSE, оператор выбораCASE, а также циклыWHILE. ЦиклWHILEможет быть прерван с помощьюBREAKили продолжен с помощьюCONTINUE. - Обработка ошибок: реализуется через блок
BEGIN TRY...END TRYиBEGIN CATCH...END CATCH. В блокеCATCHдоступны функцииERROR_MESSAGE(),ERROR_NUMBER(),ERROR_SEVERITY()и другие для получения информации об ошибке. - Транзакции: управляются командами
BEGIN TRANSACTION,COMMIT TRANSACTIONиROLLBACK TRANSACTION. T-SQL поддерживает именованные транзакции и точки сохранения (SAVE TRANSACTION). - Курсоры: позволяют построчно обрабатывать результат запроса. Курсоры объявляются (
DECLARE CURSOR), открываются (OPEN), из них извлекаются строки (FETCH) и закрываются (CLOSE). Использование курсоров считается ресурсоёмкой операцией, поэтому их рекомендуется применять только при отсутствии возможности выполнить задачу с помощью операций над множествами. - Динамический SQL: позволяет формировать и выполнять строки SQL-запросов во время выполнения программы с помощью оператора
EXECили функцииsp_executesql.
Отличия от стандартного SQL
Хотя T-SQL следует стандарту ANSI SQL (ISO/IEC 9075), он содержит множество расширений и диалектных особенностей. Основные отличия:
- Расширенная обработка данных: T-SQL поддерживает оператор
MERGE(upsert), который позволяет в одной инструкции выполнять вставку, обновление или удаление строк на основе совпадения с источником. - Работа с датами и временем: набор функций, таких как
GETDATE(),DATEADD(),DATEDIFF(),YEAR(),MONTH(), отличается от функций в других диалектах SQL (например, в PL/SQL Oracle или PL/pgSQL PostgreSQL). - Функции для работы со строками: включает функции
CHARINDEX(),PATINDEX(),SUBSTRING(),REPLACE(), а также более современныеSTRING_AGG()(с SQL Server 2017) иSTRING_SPLIT()(с SQL Server 2016). - Системные функции и представления: T-SQL предоставляет обширный набор системных функций (например,
OBJECT_ID(),DB_NAME()) и динамических представлений управления (DMV), которые позволяют получать метаданные и информацию о состоянии сервера и баз данных.
Типы данных
Transact-SQL поддерживает широкий спектр типов данных, разделённых на несколько категорий.
Числовые типы
- Точные числовые:
BIT(0, 1 или NULL),TINYINT(0–255),SMALLINT(-32 768 – 32 767),INT(-2 147 483 648 – 2 147 483 647),BIGINT(-9 223 372 036 854 775 808 – 9 223 372 036 854 775 807),DECIMALиNUMERIC(с фиксированной точностью и масштабом),SMALLMONEYиMONEY(для финансовых значений). - Приблизительные числовые:
FLOATиREAL(для чисел с плавающей точкой).
Символьные и строковые типы
- Фиксированной длины:
CHAR(n)иNCHAR(n)(для Unicode). - Переменной длины:
VARCHAR(n | MAX)иNVARCHAR(n | MAX). ТипMAXпозволяет хранить до 2 ГБ данных. - Большие объекты:
TEXTиNTEXT(устаревшие, рекомендуется использоватьVARCHAR(MAX)иNVARCHAR(MAX)).
Типы даты и времени
DATE(только дата),TIME(только время),DATETIME(дата и время с точностью до 3.33 мс),DATETIME2(более высокая точность до 100 нс),SMALLDATETIME(меньшая точность, экономия места),DATETIMEOFFSET(с учётом часового пояса).
Двоичные типы
BINARY(n)(фиксированной длины),VARBINARY(n | MAX)(переменной длины),IMAGE(устаревший, рекомендуетсяVARBINARY(MAX)).
Прочие типы
UNIQUEIDENTIFIER(GUID, 16-байтовое значение),XML(для хранения XML-документов и фрагментов),HIERARCHYID(для представления позиции в иерархии),GEOMETRY(для плоских пространственных данных),GEOGRAPHY(для геодезических данных),SQL_VARIANT(может хранить значения различных типов данных),TABLE(для временного хранения набора строк, используется в табличных переменных и возвращаемых значениях функций).
Объекты базы данных на T-SQL
Transact-SQL позволяет создавать и управлять различными объектами базы данных, которые инкапсулируют логику и код.
Хранимые процедуры
Хранимая процедура — это скомпилированный набор инструкций T-SQL, хранящийся на сервере. Процедуры могут принимать входные и выходные параметры, возвращать результаты запросов и модифицировать данные. Они используются для инкапсуляции бизнес-логики, повышения производительности (за счёт кэширования плана выполнения) и обеспечения безопасности.
Триггеры
Триггер — это специальный тип хранимой процедуры, который автоматически выполняется при наступлении определённого события в базе данных. Различают DML-триггеры (срабатывают на INSERT, UPDATE, DELETE для таблиц или представлений) и DDL-триггеры (срабатывают на события изменения схемы, такие как CREATE TABLE, ALTER PROCEDURE). Триггеры используются для поддержки целостности данных, аудита и реализации сложных бизнес-правил.
Пользовательские функции
Пользовательские функции (UDF) возвращают одно скалярное значение или таблицу. Скалярные функции могут использоваться в выражениях и запросах. Табличные функции возвращают набор строк и могут быть встроенными (inline) или многооператорными (multi-statement). Функции не могут изменять состояние базы данных (не должны иметь побочных эффектов).
Представления
Представление (view) — это виртуальная таблица, основанная на результате запроса. Оно не хранит данные физически, а динамически извлекает их из базовых таблиц. Представления используются для упрощения сложных запросов, обеспечения безопасности (ограничение доступа к определённым столбцам или строкам) и обеспечения обратной совместимости.
Применение
Transact-SQL является основным инструментом для работы с базами данных Microsoft SQL Server и Azure SQL Database. Он применяется в следующих областях:
- Разработка приложений: написание запросов для извлечения, вставки, обновления и удаления данных из приложений на C#, Java, Python и других языках.
- Администрирование баз данных: создание и изменение схемы базы данных (таблиц, индексов, ограничений), управление пользователями и правами доступа, настройка резервного копирования и мониторинга.
- Бизнес-аналитика и отчётность: построение сложных отчётов и аналитических запросов с использованием агрегатных функций, оконных функций и обобщённых табличных выражений.
- Интеграция данных: использование T-SQL в пакетах SQL Server Integration Services (SSIS) для извлечения, преобразования и загрузки данных (ETL).
- Автоматизация задач: написание заданий агента SQL Server (SQL Server Agent), которые выполняют скрипты T-SQL по расписанию.
Инструменты разработки
Для написания и выполнения кода Transact-SQL используются следующие основные инструменты:
- SQL Server Management Studio (SSMS): основной графический инструмент для управления SQL Server, включающий редактор кода, обозреватель объектов, профилировщик и другие утилиты.
- Azure Data Studio: кроссплатформенный редактор с поддержкой расширений, ориентированный на работу с облачными базами данных Azure SQL и локальными версиями SQL Server.
- SQLCMD: утилита командной строки для выполнения скриптов T-SQL.
- Visual Studio / VS Code: интегрированные среды разработки, поддерживающие расширения для работы с SQL Server и T-SQL.
Критика и ограничения
Несмотря на широкое распространение, Transact-SQL имеет ряд недостатков:
- Привязка к платформе: код T-SQL не является переносимым на другие СУБД (Oracle, PostgreSQL, MySQL) без существенной переработки.
- Производительность курсоров: использование курсоров для построчной обработки данных значительно медленнее, чем операции над множествами, и может приводить к проблемам с производительностью.
- Сложность отладки: отладка хранимых процедур и функций в SSMS менее удобна по сравнению с современными языками программирования.
- Ограниченная модульность: в T-SQL отсутствуют некоторые механизмы модульности, свойственные языкам общего назначения (например, пространства имён, наследование).
Источники
- Microsoft Docs. Transact-SQL (T-SQL) Reference. Microsoft Corporation.
- Ben-Gan, I. (2016). T-SQL Fundamentals. Microsoft Press.
- Ben-Gan, I., Machanic, A., Sarka, D., & Viescas, J. (2015). T-SQL Querying. Microsoft Press.
- Стандарт ISO/IEC 9075:2016 (SQL:2016). International Organization for Standardization.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →