Transact-SQL ( T-SQL ) — это фирменное расширение SQL (языка структурированных запросов) , разработанное Microsoft и Sybase и используемое для взаимодействия с реляционными базами данных . T-SQL расширяет стандарт SQL, включая процедурное программирование , локальные переменные , различные вспомогательные функции для обработки строк, обработки дат, математики и т. д., а также изменения в операторах DELETE и UPDATE .
Transact-SQL является центральным элементом использования Microsoft SQL Server . Все приложения, взаимодействующие с экземпляром SQL Server, делают это путем отправки операторов Transact-SQL на сервер, независимо от пользовательского интерфейса приложения.
Хранимые процедуры в SQL Server — это исполняемые серверные процедуры. Преимущество хранимых процедур — возможность передавать параметры.
Transact-SQL предоставляет следующие операторы для объявления и установки локальных переменных: DECLARE
, SET
и SELECT
.
DECLARE @var1 NVARCHAR ( 30 ); SET @var1 = 'Некое имя' ; SELECT @var1 = Имя FROM Продажи . Магазин WHERE CustomerID = 100 ;
Ключевые слова для управления потоком в Transact-SQL включают BEGIN
и END
, BREAK
, CONTINUE
, GOTO
, IF
и ELSE
, RETURN
, WAITFOR
, и WHILE
.
IF
и ELSE
разрешить условное выполнение. Этот пакетный оператор выведет "It is the weekend", если текущая дата является выходным днем, или "It is a weekday", если текущая дата является будним днем. (Примечание: этот код предполагает, что воскресенье настроено как первый день недели в настройках @@DATEFIRST
.)
IF DATEPART ( dw , GETDATE ()) = 7 OR DATEPART ( dw , GETDATE ()) = 1 PRINT 'Сейчас выходные.' ; ELSE PRINT 'Сейчас будний день.' ;
BEGIN
и END
пометить блок операторов . Если в приведенном выше примере условным оператором должно управляться более одного оператора, мы можем использовать BEGIN
и END
следующим образом:
IF DATEPART ( dw , GETDATE ()) = 7 OR DATEPART ( dw , GETDATE ()) = 1 BEGIN PRINT 'Сейчас выходные.' ; PRINT 'Отдохнем на выходных!' ; END ; ELSE BEGIN PRINT 'Сейчас будний день.' ; PRINT 'Приступим к работе в будний день!' ; END ;
WAITFOR
будет ждать заданное количество времени или до определенного времени суток. Оператор может использоваться для задержек или для блокировки выполнения до установленного времени.
RETURN
используется для немедленного возврата из хранимой процедуры или функции.
BREAK
завершает охватывающий WHILE
цикл, в то время как CONTINUE
вызывает выполнение следующей итерации цикла. Пример цикла WHILE
приведен ниже.
ОБЪЯВИТЬ @i INT ; УСТАНОВИТЬ @i = 0 ; WHILE @i < 5 BEGIN PRINT 'Привет, мир.' ; SET @i = @i + 1 ; END ;
В Transact-SQL оба оператора DELETE
и UPDATE
улучшены, что позволяет использовать в операции данные из другой таблицы без необходимости в подзапросе:
DELETE
принимает объединенные таблицы в FROM
предложении, аналогично SELECT
. Когда это сделано, имя или псевдоним таблицы, из которой в соединении необходимо удалить, помещается между DELETE
и FROM
.UPDATE
позволяет FROM
добавлять предложение. Обновляемая таблица может быть либо присоединена к FROM
предложению и указана по псевдониму, либо указана только в начале оператора в соответствии со стандартным SQL.В этом примере удаляются все users
, кто помечен в user_flags
таблице флагом «бездействие».
УДАЛИТЬ u ИЗ пользователей AS u INNER JOIN user_flags AS f ON u . id = f . id WHERE f . name = 'idle' ;
BULK
— это оператор Transact-SQL, реализующий процесс массовой загрузки данных, вставку нескольких строк в таблицу, чтение данных из внешнего последовательного файла. Использование BULK INSERT
приводит к лучшей производительности, чем процессы, которые выдают отдельные INSERT
операторы для каждой добавляемой строки. Дополнительные сведения доступны в MSDN.
Начиная с SQL Server 2005, [1] Microsoft ввела дополнительную TRY CATCH
логику для поддержки поведения типа исключения. Такое поведение позволяет разработчикам упростить свой код и исключить @@ERROR
проверку после каждого оператора выполнения SQL.
-- начать транзакцию BEGIN TRAN ; BEGIN TRY -- выполнить каждый оператор INSERT INTO MYTABLE ( NAME ) VALUES ( 'ABC' ); INSERT INTO MYTABLE ( NAME ) VALUES ( '123' ); -- зафиксировать транзакцию COMMIT TRAN ; END TRY BEGIN CATCH -- откатить транзакцию из-за ошибки ROLLBACK TRAN ; END CATCH ;