Transact-SQL(簡稱 T-SQL) 是 Microsoft SQL Server 與 Sybase Adaptive Server 的專屬擴充語言,建立在 ANSI SQL-92 標準之上,並大量加入程式設計結構、錯誤處理、交易控制與系統管理指令。相當於 Oracle 的 PL/SQL,T-SQL 是撰寫預存程序、觸發器、使用者定義函數、動態 SQL 以及實作資料層商業邏輯的核心工具。
| 分類 | 全名 | 核心指令 | 典型用途 |
|---|---|---|---|
| DDL | Data Definition Language | CREATE / ALTER / DROP | 建立、修改、刪除資料庫物件(資料表、檢視、預存程序、函數、自訂型別等) |
| DML | Data Manipulation Language | SELECT / INSERT / UPDATE / DELETE | 資料的查詢、新增、修改、刪除(CRUD) |
| DCL | Data Control Language | GRANT / REVOKE / DENY | 權限授與、收回、拒絕,管控資料庫與物件存取安全 |
T-SQL 支援以分號 ; 分隔多條陳述式,例如:
INSERT INTO MyTable (MyText) VALUES (@MyText); SELECT @@IDENTITY;
BEGIN ... END:定義陳述式區塊,配合 IF ... ELSE 使用;若區塊內超過一條指令,必須加上 BEGIN/END,否則編譯錯誤。WHILE 是 T-SQL 唯一 的迴圈結構,迴圈本體同樣需以 BEGIN/END 包裹。
RETURN:立即終止批次或程序執行。WAITFOR DELAY '00:00:10' / WAITFOR TIME '23:59:59':延遲或定時繼續。GOTO Label:無條件跳轉(慎用,易產生義大利麵代碼)。DECLARE @v INT; -- 宣告
SET @v = 50; -- 純量賦值(ANSI 標準)
SELECT @v = SUM(Qty) -- 從查詢結果賦值
FROM SaleItemRecords
WHERE SaleID = 53928;
注意:SET 一次只能指派一個變數;SELECT 可同時指派多個變數,且若查詢傳回多列,變數最終值為最後一列的值。
| 機制 | 適用版本 | 特性 |
|---|---|---|
RAISERROR | 所有版本 | 拋出自訂錯誤號、嚴重等級、狀態;可搭配 WITH LOG 寫入錯誤記錄。 |
PRINT | 所有版本 | 輸出訊息至用戶端(SSMS「訊息」頁籤),常用於除錯。 |
TRY ... CATCH | SQL Server 2005+ | 結構化例外處理,支援 ERROR_NUMBER()、ERROR_MESSAGE() 等系統函數取得錯誤細節,強烈建議新專案採用。 |
BEGIN TRY
-- 高風險操作
INSERT INTO Accounts (Id, Balance) VALUES (1, -100); -- 假設有 CHECK 約束
END TRY
BEGIN CATCH
-- 記錄錯誤、回滾交易、拋出或吞噬
SELECT ERROR_NUMBER() AS ErrNo, ERROR_MESSAGE() AS ErrMsg;
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
-- RAISERROR(...); -- 視需求決定是否向上拋出
END CATCH;
INSERT ... SELECT 或 MERGE 解決,絕不寫游標或 WHILE 迴圈逐筆處理。sp_executesql @stmt, N'@p int', @p),防 SQL Injection 並促進計畫重用。COMPATIBILITY_LEVEL 與 sys.dm_exec_describe_first_result_set 驗證語法相容性,升級前務必跑測試套件。Microsoft 官方參考文件(含語法圖、範例、最佳實務)請參閱:
Transact-SQL 參考 (Microsoft Learn)
掌握 T-SQL 不僅是記語法,更是理解查詢最佳化器、鎖定機制、交易隔離等級、執行計畫快取等引擎核心行為。建議搭配 SET STATISTICS IO/TIME ON、Execution Plan、Query Store 進行效能調校,將「能跑」升級為「跑得快、穩、可維護」。