字符串處理是 SQL 開發的高頻需求。本文系統整理 SQL Server 核心字符串函數,按功能分類附帶語法與關鍵行為說明,供開發查閱。
一、字符轉換函數
| 函數 | 功能 | 關鍵說明 |
ASCII(char_expr) | 返回最左字符 ASCII 碼 | 純數字字符串可不加引號,含其他字符必須加單引號 |
CHAR(int_expr) | ASCII 碼轉字符 | 輸入需在 0-255 範圍,否則返回 NULL |
LOWER / UPPER | 大小寫轉換 | |
STR(float_expr [, length [, decimal]]) | 數值轉字符 | 預設 length=10, decimal=0;length<小數點左位數時返回 *;左側補空格 |
二、去空格函數
LTRIM():移除左側空格
RTRIM():移除右側空格
- 無內建 TRIM()(SQL Server 2017+ 才支援),常用
LTRIM(RTRIM()) 組合。
三、取子串函數
| 函數 | 語法 | 說明 |
LEFT | LEFT(char_expr, int_expr) | 返回左起 N 字符 |
RIGHT | RIGHT(char_expr, int_expr) | 返回右起 N 字符 |
SUBSTRING | SUBSTRING(char_expr, start, length) | 從 start 位置取 length 字符(起始位 1-based) |
四、字符串比較/搜尋函數
| 函數 | 語法 | 差異點 |
CHARINDEX | CHARINDEX('substr', expr) | 返回子串首次出現位置,不支援 TEXT/IMAGE,不支援通配符 |
PATINDEX | PATINDEX('%pattern%', expr) | 模式前後必須有 %,支援通配符,適用 CHAR/VARCHAR/TEXT |
五、字符串操作函數
| 函數 | 語法 | 典型用途 |
QUOTENAME | QUOTENAME('str' [, 'quote_char']) | 加括號/引號,預設 [],動態 SQL 防注入常用 |
REPLICATE | REPLICATE(str, int) | 重複字符串,int<0 返回 NULL |
REVERSE | REVERSE(str) | 字符順序反轉 |
REPLACE | REPLACE(str, old, new) | 替換所有 old 為 new |
SPACE | SPACE(int) | 生成指定長度空格串 |
STUFF | STUFF(str, start, len, new_str) | 刪除 start 起 len 字符並插入 new_str,start/len 異常返回 NULL |
六、數據類型轉換函數
- CAST:
CAST(expr AS data_type [length]) —— ANSI 標準,可移植性強。
- CONVERT:
CONVERT(data_type [length], expr [, style]) —— SQL Server 專有,style 參數支援豐富日期/時間格式化(如 120=ODBC 標準 yyyy-mm-dd hh:mi:ss)。
關鍵限制:用戶自定義類型不可用;TEXT→VARCHAR 最大 8000 字符;IMAGE→VARBINARY 最大 8000 位元組;截斷時顯示 "+" 標識。
七、日期時間函數
| 函數 | 功能 | 備註 |
DAY / MONTH / YEAR | 提取日/月/年 | 等同 DATEPART(dd|mm|yy, date) |
DATEADD | 日期加減間隔 | DATEADD(datepart, number, date) |
DATEDIFF | 兩日期差值 | 返回帶符號整數 DATEDIFF(datepart, start, end) |
DATENAME | 日期部分字符串 | 如月份名稱 'January' |
DATEPART | 日期部分整數 | 可提取 quarter, week, weekday 等 |
GETDATE | 當前系統日期時間 | 精度至毫秒(約 3.33ms) |
實戰提示
- 大量字符串拼接場景建議使用
STRING_AGG (SQL 2017+) 或 FOR XML PATH 技巧,避免標量函數逐行調用開銷。
- 動態 SQL 中識別欄位名請用
QUOTENAME 防注入。
- 日期篩選優先用
WHERE date_col >= '20240101' AND date_col < '20240201' 利用索引,避免對欄位套用函數導致掃描。