Открыть сервис

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 отсутствуют некоторые механизмы модульности, свойственные языкам общего назначения (например, пространства имён, наследование).

Источники

  1. Microsoft Docs. Transact-SQL (T-SQL) Reference. Microsoft Corporation.
  2. Ben-Gan, I. (2016). T-SQL Fundamentals. Microsoft Press.
  3. Ben-Gan, I., Machanic, A., Sarka, D., & Viescas, J. (2015). T-SQL Querying. Microsoft Press.
  4. Стандарт ISO/IEC 9075:2016 (SQL:2016). International Organization for Standardization.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →