T-SQL 中資料型別轉換分為 顯式轉換 (開發者主動呼叫 `CAST`/`CONVERT`) 與 隱式轉換 (引擎依優先順序自動轉換)。隱式轉換雖便利,卻藏著型別優先級導致的查詢失效、索引無法求值、效能退化等陷阱。本文系統整理轉換語法、隱式轉換風險實測與最佳實務。
| 函數 | 語法 | 特點 |
|---|---|---|
| CAST | CAST ( expression AS data_type ) | ANSI 標準、可跨平台、不支援格式化樣式 |
| CONVERT | CONVERT ( data_type [ ( length ) ], expression [ , style ] ) | SQL Server 專用、支援 style 格式化日期/貨幣/二進位 |
常用 style 範例:
CONVERT(VARCHAR(10), GETDATE(), 120) → `2024-01-15` (YYYY-MM-DD)CONVERT(VARCHAR(20), GETDATE(), 121) → `2024-01-15 14:30:45.123` (含毫秒)CONVERT(VARBINARY(MAX), 'Hello', 1) → `0x48656C6C6F` (含 0x 前綴)規則: 低優先級型別自動轉換為高優先級型別 (如 `smallint` → `int`、`varchar` → `nvarchar`)。
場景: 表 `Demo` 有 `混合ID NVARCHAR(50)` 主鍵,儲存 `INT` 轉字串 (如 `'305'`) 與 `UNIQUEIDENTIFIER` 轉字串 (如 `'4C185367-F004-41FE-8A0A-DB4E819B1FF2'`) 混雜值。
查詢: SELECT * FROM Demo WHERE 混合ID = 305 (未加引號,數字常值)
執行過程:
在將 nvarchar 值 '...' 轉換成資料類型 int 時失敗。





| SQL | 結果 | 原因 |
|---|---|---|
WHERE 混合ID = 305 | ❌ 失敗 | 欄位隱式轉 INT,GUID 炸彈觸發 |
WHERE 混合ID = '305' | ✅ 成功 | 字串比較,無轉換 |
WHERE 混合ID = '305' AND 名稱='INT' | ✅ 成功 | 同左,額外過濾 |
WHERE 混合ID = 305 AND 序號=2 | ✅ 成功 | 優化器可能先套用 序號=2 過濾掉 GUID 列 |
CONVERT_IMPLICIT 出現在執行計畫 `Compute Scalar` 運算子,增加 CPU 開銷。「顯式優於隱式」不僅是程式碼可讀性原則,更是 SQL Server 穩定效能與正確性的基石。