首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 常用字串函數完整參考手冊

     編輯:關於SqlServer

T-SQL 字串操作函數分類與實戰範例

SQL Server 提供豐富的字串函數支援資料清洗、格式化、解析、搜尋等需求。本文依功能分類整理,附上效能提示與版本相容性說明。

一、字元代碼轉換

函數語法說明範例結果
ASCIIASCII(char_expr)回傳最左字元的 ASCII 碼ASCII('A')65
CHARCHAR(int_expr)回傳指定 ASCII 碼的字元 (0-255)CHAR(65)'A'
NCHARNCHAR(int_expr)回傳 Unicode 碼位字元 (0-65535)NCHAR(0x4E2D)N'中'
UNICODEUNICODE(nchar_expr)回傳最左字元的 Unicode 碼位UNICODE(N'中')20013

二、大小寫轉換

-- 基本轉換
UPPER('Hello World')   -- 'HELLO WORLD'
LOWER('Hello World')   -- 'hello world'

-- 標題大小寫 (首字大寫) - 需自行實作或使用 CLR
-- 簡易版:
SELECT UPPER(LEFT(@str,1)) + LOWER(SUBSTRING(@str,2,LEN(@str)));

三、去除空白字元

函數語法說明範例
LTRIMLTRIM(str)移除前導空白LTRIM(' Hello') → 'Hello'
RTRIMRTRIM(str)移除尾隨空白RTRIM('Hello ') → 'Hello'
TRIMTRIM([chars FROM] str)移除前後指定字元 (2017+)TRIM(' Hello ') → 'Hello'
TRIM('xy' FROM 'xyHelloxy') → 'Hello'

四、子字串擷取

函數語法說明範例
LEFTLEFT(str, len)左側起指定長度LEFT('ABCDEF', 3) → 'ABC'
RIGHTRIGHT(str, len)右側起指定長度RIGHT('ABCDEF', 3) → 'DEF'
SUBSTRINGSUBSTRING(str, start, len)指定位置起指定長度 (1-based)SUBSTRING('ABCDEF', 2, 3) → 'BCD'
STUFFSTUFF(str, start, len, new_str)刪除指定長度並插入新字串STUFF('ABCDEF', 2, 3, 'XY') → 'AXYEF'

五、字串搜尋與定位

函數語法說明範例
CHARINDEXCHARINDEX(find, str [, start])尋找子字串位置,不支援萬用字元CHARINDEX('BC', 'ABCDEF') → 2
PATINDEXPATINDEX('%pattern%', str)支援萬用字元模式搜尋PATINDEX('%C_D%', 'ABCDEF') → 3
STRING_SPLITSTRING_SPLIT(str, separator)分割字串為資料列集 (2016+)SELECT * FROM STRING_SPLIT('A,B,C', ',')

六、字串建構與修飾

函數語法說明範例
QUOTENAMEQUOTENAME(str [, quote_char])加上分隔符號 (預設 [],支援 '' "" () {})QUOTENAME('table') → '[table]'
REPLICATEREPLICATE(str, count)重複字串指定次數REPLICATE('AB', 3) → 'ABABAB'
REVERSEREVERSE(str)反轉字串順序REVERSE('ABC') → 'CBA'
SPACESPACE(count)產生指定數量空白字元SPACE(5) → ' '
CONCATCONCAT(val1, val2, ...)串接多值,自動處理 NULL (2012+)CONCAT('A', NULL, 'B') → 'AB'
CONCAT_WSCONCAT_WS(sep, val1, val2, ...)指定分隔符號串接 (2017+)CONCAT_WS(',', 'A', 'B', 'C') → 'A,B,C'
TRANSLATETRANSLATE(str, from_chars, to_chars)字元級對應替換 (2017+)TRANSLATE('abc', 'abc', '123') → '123'

七、格式化與轉換

函數語法說明範例
STRSTR(float, length, decimal)數值轉字串,固定寬度右對齊STR(123.45, 10, 2) → ' 123.45'
FORMATFORMAT(value, format [, culture]).NET 格式化,支援文化特性 (2012+)FORMAT(1234.5, 'C', 'zh-TW') → 'NT$1,234.50'
CAST/CONVERTCAST(expr AS type) / CONVERT(type, expr, style)型別轉換,CONVERT 支援日期格式代碼CONVERT(VARCHAR, GETDATE(), 120) → '2024-01-15 14:30:00'

八、進階解析函數 (2016+)

-- JSON 路徑提取
JSON_VALUE(@json, '$.store.book[0].author')  -- 純量值
JSON_QUERY(@json, '$.store.book')            -- 物件/陣列片段
JSON_MODIFY(@json, '$.price', 19.99)         -- 修改回傳新 JSON

-- 字串分割 (替代自訂函數)
SELECT value, ordinal FROM STRING_SPLIT('A,B,C', ',') ORDER BY ordinal;
-- ordinal 欄位需搭配 ROW_NUMBER() 或 OPENJSON 取得順序

實戰範例:常見字串處理場景

1. 移除 HTML 標籤

CREATE FUNCTION dbo.fn_StripHtml(@Html NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS BEGIN
    WHILE CHARINDEX('<', @Html) > 0
    BEGIN
        DECLARE @Start INT = CHARINDEX('<', @Html);
        DECLARE @End INT = CHARINDEX('>', @Html, @Start);
        IF @End = 0 BREAK;
        SET @Html = STUFF(@Html, @Start, @End - @Start + 1, '');
    END
    RETURN @Html;
END;

2. 解析 CSV 行 (處理引號、逗號)

-- 簡易版:假設無巢狀引號
SELECT * FROM STRING_SPLIT(REPLACE(@csv, '","', '|'), '|');

-- 完整版:使用 OPENJSON (2016+)
DECLARE @Json NVARCHAR(MAX) = '["' + REPLACE(REPLACE(@csv, '"', '""'), ',', '","') + '"]';
SELECT value FROM OPENJSON(@Json);

3. 產生固定長度代碼 (補零)

-- RIGHT 技巧
SELECT RIGHT('000000' + CAST(@Num AS VARCHAR(6)), 6);  -- 6 位數補零

-- FORMAT (2012+)
SELECT FORMAT(@Num, 'D6');  -- 相同效果

4. 字串相似度比較 (簡易版)

-- Levenshtein 距離需 CLR 或自訂函數
-- 簡易 Jaccard 相似度 (字元集合交集/聯集)
-- 實際專案建議使用全文搜尋或 Azure Cognitive Services

效能優化關鍵提醒

  • ✅ 避免在 WHERE/JOIN 中對欄位使用函數:WHERE UPPER(Name) = 'JOHN' → 無法使用索引。改為 WHERE Name = 'John' COLLATE Latin1_General_CI_AI
  • ✅ 大量字串串接使用 XML PATH 或 STRING_AGG (2017+):迴圈 CONCAT 效能差
  • ✅ CHARINDEX 優於 PATINDEX:無萬用字元需求時
  • ✅ SUBSTRING/STUFF 比 LEFT/RIGHT 靈活:但 LEFT/RIGHT 可讀性佳
  • ✅ NCHAR/NVARCHAR 處理 Unicode:避免隱含轉換導致索引失效
  • ✅ FORMAT 效能較差:高頻呼叫改用 CONVERT + 風格代碼

版本相容性速查表

函數引入版本備註
TRIMSQL Server 2017 (14.x)LTRIM/RTRIM 所有版本
CONCATSQL Server 2012 (11.x)
CONCAT_WSSQL Server 2017
TRANSLATESQL Server 2017
STRING_SPLITSQL Server 2016無 ordinal 欄位,2022+ 支援 ordinal
STRING_AGGSQL Server 2017GROUP BY 內串接
FORMATSQL Server 2012依賴 .NET CLR,效能較慢
JSON_*SQL Server 2016
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved