前言
熟練掌握 T-SQL 內建函數是資料庫開發與優化的基礎。本文系統整理 SQL Server 常用的四大類函數:字串、數學、日期時間與系統函數,並附上語法說明與典型應用場景,供開發人員快速查閱。
一、字串函數
1. 長度與分析
| 函數 | 語法 | 說明 | 範例 |
| DATALENGTH | DATALENGTH(char_expr) | 返回字串位元組長度(不含尾端空格) | DATALENGTH('ABC ') → 3 |
| SUBSTRING | SUBSTRING(expression, start, length) | 擷取子字串 | SUBSTRING('Hello', 2, 3) → 'ell' |
| RIGHT | RIGHT(char_expr, int_expr) | 取右側指定長度字元 | RIGHT('SQLServer', 6) → 'Server' |
2. 字元操作
| 函數 | 語法 | 說明 |
| UPPER | UPPER(char_expr) | 轉大寫 |
| LOWER | LOWER(char_expr) | 轉小寫 |
| SPACE | SPACE(int_expr) | 產生指定數量空白字元 |
| REPLICATE | REPLICATE(char_expr, int_expr) | 重複字串 N 次 |
| REVERSE | REVERSE(char_expr) | 反轉字串 |
| STUFF | STUFF(char_expr1, start, length, char_expr2) | 刪除字串指定區段並插入新字串 |
| LTRIM / RTRIM | LTRIM(char_expr) / RTRIM(char_expr) | 移除左側/右側空白 |
| ASCII / CHAR | ASCII(char) / CHAR(ascii) | 字元與 ASCII 碼互轉 |
3. 字串查找
| 函數 | 語法 | 說明 |
| CHARINDEX | CHARINDEX(char_expr, expression) | 返回子字串首次出現位置(1-based),找不到回傳 0 |
| PATINDEX | PATINDEX('%pattern%', expression) | 支援萬用字元模式比對,返回首次匹配位置 |
二、數學函數
| 函數 | 語法 | 說明 |
| ABS | ABS(numeric_expr) | 絕對值 |
| CEILING | CEILING(numeric_expr) | 大於等於指定值的最小整數 |
| EXP | EXP(float_expr) | 自然指數 e^x |
| FLOOR | FLOOR(numeric_expr) | 小於等於指定值的最大整數 |
| PI | PI() | 返回圓周率 3.1415926… |
| POWER | POWER(numeric_expr, power) | 冪運算 |
| RAND | RAND([int_expr]) | 隨機數(可選種子) |
| ROUND | ROUND(numeric_expr, int_expr) | 四捨五入至指定精度 |
| SIGN | SIGN(int_expr) | 正/零/負 返回 +1/0/-1 |
| SQRT | SQRT(float_expr) | 平方根 |
三、日期時間函數
1. 核心函數
| 函數 | 語法 | 說明 |
| GETDATE | GETDATE() | 取得目前系統日期時間 |
| DATENAME | DATENAME(datepart, date_expr) | 返回日期部分的名稱(如 'June'、'Monday') |
| DATEPART | DATEPART(datepart, date_expr) | 返回日期部分的整數值 |
| DATEDIFF | DATEDIFF(datepart, start, end) | 兩日期間的差值 |
| DATEADD | DATEADD(datepart, number, date_expr) | 日期加減運算 |
2. datepart 參數對照表
| 縮寫 | 範圍 | 意義 |
| yy / yyyy | 1753-9999 | 年 |
| qq / q | 1-4 | 季 |
| mm / m | 1-12 | 月 |
| dy / y | 1-366 | 年間第幾天 |
| dd / d | 1-31 | 日 |
| wk / ww | 1-54 | 週 |
| dw / w | 1-7 | 星期幾 |
| hh | 0-23 | 時 |
| mi / n | 0-59 | 分 |
| ss / s | 0-59 | 秒 |
| ms | 0-999 | 毫秒 |
3. 日期轉換
使用 CONVERT(data_type, expression, style) 進行日期格式化,常用 style 代碼:
- 101: mm/dd/yyyy (美式)
- 102: yyyy.mm.dd (ANSI)
- 103: dd/mm/yyyy (英式)
- 112: yyyymmdd (ISO 無分隔)
- 120: yyyy-mm-dd hh:mi:ss (ODBC 標準)
四、系統函數
| 函數 | 說明 |
| SUSER_NAME() | 登入帳號名稱 |
| USER_NAME() | 資料庫使用者名稱 |
| USER | 同 USER_NAME() |
| SHOW_ROLE() | 當前使用者生效角色 |
| DB_NAME() | 目前資料庫名稱 |
| OBJECT_NAME(obj_id) | 物件名稱 |
| COL_NAME(obj_id, col_id) | 欄位名稱 |
| COL_LENGTH(obj_name, col_name) | 欄位定義長度 |
| VALID_NAME(char_expr) | 驗證是否為合法識別碼 |
實務建議
- 字串比較、查找時優先使用
CHARINDEX 而非 PATINDEX,效能較佳。
- 日期運算盡量用
DATEADD/DATEDIFF 避免字串轉換。
- 大量資料運算時,將標量函數改寫為內聯表值函數或直接在查詢中運算,減少函數呼叫開銷。