T-SQL 僅支援內建函數操作欄位,不可直接呼叫程式語言函數(如 IndexOf)。本文系統整理字串、日期、資料型別轉換、彙總等高頻函數,附語法與注意事項,作為開發速查手冊。
| 函數 | 語法 | 說明 | 注意事項 |
|---|---|---|---|
| ASCII | ASCII(char_expr) | 回傳最左字元 ASCII 碼 | 純數字字串可不加引號,含其他字元必須用單引號 |
| CHAR | CHAR(ascii_code) | ASCII 碼轉字元 | 輸入 0-255 以外回傳 NULL |
| LOWER / UPPER | LOWER/UPPER(char_expr) | 全轉小寫/大寫 | - |
| STR | STR(float_expr [, length [, decimal]]) | 數值轉字串 | length 預設 10,decimal 預設 0;負值回傳 NULL;長度不足左補空格;length < 整數位回傳 * |
| 函數 | 語法 | 說明 |
|---|---|---|
| LTRIM | LTRIM(char_expr) | 移除前導空格 |
| RTRIM | RTRIM(char_expr) | 移除尾隨空格 |
技巧:LTRIM(RTRIM(col)) 同時去首尾空格。
| 函數 | 語法 | 說明 |
|---|---|---|
| LEFT | LEFT(char_expr, int_expr) | 左起 N 字元 |
| RIGHT | RIGHT(char_expr, int_expr) | 右起 N 字元 |
| SUBSTRING | SUBSTRING(expr, start, length) | 從 start 位置取 length 字元 |
| 函數 | 語法 | 說明 | 差異 |
|---|---|---|---|
| CHARINDEX | CHARINDEX('substr', expr) | 回傳子串首次出現位置(1-based),找不到回 0 | 不支援 TEXT/IMAGE;子串無萬用字元 |
| PATINDEX | PATINDEX('%pattern%', col_name) | 回傳模式首次出現位置 | 支援萬用字元(% _);適用 CHAR/VARCHAR/TEXT |
| 函數 | 語法 | 說明 |
|---|---|---|
| QUOTENAME | QUOTENAME('expr' [, 'quote_char']) | 以指定字元包裹字串,預設 [] |
| REPLICATE | REPLICATE(char_expr, int_expr) | 重複字串 N 次;負數回傳 NULL |
| REVERSE | REVERSE(char_expr) | 字串反轉 |
| REPLACE | REPLACE(str1, str2, str3) | 將 str1 中的 str2 替換為 str3 |
| SPACE | SPACE(int_expr) | 產生 N 個空格;負數回傳 NULL |
| STUFF | STUFF(char1, start, len, char2) | 將 char1 從 start 起長度 len 替換為 char2;start/len 為負或 start>長度回傳 NULL |
| 函數 | 語法 | 關鍵規則 |
|---|---|---|
| CAST | CAST(expr AS data_type [length]) | ANSI 標準,可攜性佳 |
| CONVERT | CONVERT(data_type [length], expr [, style]) | 支援 style 格式化日期/時間; 用戶自訂型別不可用; TEXT→CHAR/VARCHAR 限 8000 字元; IMAGE→BINARY/VARBINARY 限 8000 位元組; 整數→MONEY 依國家貨幣格式; 非零→BIT 為 1; 截斷時顯示 + 號 |
CONVERT style 常用值:112 (yyyymmdd)、120 (yyyy-mm-dd hh:mi:ss)、121 (含毫秒)、101 (mm/dd/yyyy)、103 (dd/mm/yyyy)。
| 函數 | 語法 | 說明 |
|---|---|---|
| DAY | DAY(date_expr) | 回傳日期日部分 (1-31) |
| MONTH | MONTH(date_expr) | 回傳月份 (1-12) |
| YEAR | YEAR(date_expr) | 回傳年份 (四位數) |
| DATEADD | DATEADD(datepart, number, date) | 日期加減間隔,回傳新日期 |
| DATEDIFF | DATEDIFF(datepart, date1, date2) | 回傳 date2 - date1 在 datepart 上的差值 (帶正負號整數) |
| DATENAME | DATENAME(datepart, date) | 以字串回傳日期指定部分(如月份名稱) |
| DATEPART | DATEPART(datepart, date) | 以整數回傳日期指定部分; DATEPART(dd,date)=DAY(date) DATEPART(mm,date)=MONTH(date) DATEPART(yy,date)=YEAR(date) |
| GETDATE | GETDATE() | 回傳系統當前日期時間 (DATETIME) |
datepart 常用值:year/yy/yyyy、quarter/qq/q、month/mm/m、dayofyear/dy/y、day/dd/d、week/wk/ww、weekday/dw、hour/hh、minute/mi/n、second/ss/s、millisecond/ms。
| 函數 | 說明 |
|---|---|
| COUNT(*) | 回傳列數(含 NULL) |
| COUNT(DISTINCT col) | 回傳欄位非重複值個數 |
| SUM(col/expr) | 數值總和 |
| SUM(DISTINCT col) | 非重複值總和 |
| AVG(col/expr) | 數值平均 |
| AVG(DISTINCT col) | 非重複值平均 |
| MIN(col/expr) | 最小值 |
| MAX(col/expr) | 最大值 |
-- 錯誤:IndexOf 非 SQL 函數
SELECT col1 FROM t1 WHERE col1.IndexOf('雲') = 1
-- 正確:使用 CHARINDEX (位置從 1 起算)
SELECT col1 FROM t1 WHERE CHARINDEX('雲', col1) = 1
-- 或 PATINDEX 配合萬用字元
SELECT col1 FROM t1 WHERE PATINDEX('%雲%', col1) > 0