利用 Unicode CJK 統一表意文字區間 (U+4E00~U+9FA5) 搭配 COLLATE Chinese_PRC_CS_AS_KS_WS 二進位比較,建立對照表映射首字母,無需 CLR、無需外部資源,效能可接受。
CREATE FUNCTION dbo.fn_GetPinyinInitial (@str NVARCHAR(4000))
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @word NCHAR(1), @py NVARCHAR(4000) = N'';
WHILE LEN(@str) > 0
BEGIN
SET @word = LEFT(@str, 1);
-- 判斷是否為 CJK 統一漢字區間
SET @py += CASE
WHEN UNICODE(@word) BETWEEN 0x4E00 AND 0x9FA5 -- 19968~40869
THEN (
SELECT TOP 1 PY FROM (
SELECT N'A' AS PY, N'駌' AS word UNION ALL SELECT N'B', N'簿' UNION ALL
SELECT N'C', N'錯' UNION ALL SELECT N'D', N'鵽' UNION ALL
SELECT N'E', N'樲' UNION ALL SELECT N'F', N'鳆' UNION ALL
SELECT N'G', N'腂' UNION ALL SELECT N'H', N'夻' UNION ALL
SELECT N'J', N'攈' UNION ALL SELECT N'K', N'穒' UNION ALL
SELECT N'L', N'鱳' UNION ALL SELECT N'M', N'旀' UNION ALL
SELECT N'N', N'桛' UNION ALL SELECT N'O', N'漚' UNION ALL
SELECT N'P', N'曝' UNION ALL SELECT N'Q', N'囕' UNION ALL
SELECT N'R', N'鶸' UNION ALL SELECT N'S', N'蜶' UNION ALL
SELECT N'T', N'箨' UNION ALL SELECT N'W', N'鷐' UNION ALL
SELECT N'X', N'鑂' UNION ALL SELECT N'Y', N'韻' UNION ALL
SELECT N'Z', N'咗'
) T
WHERE word >= @word COLLATE Chinese_PRC_CS_AS_KS_WS
ORDER BY PY ASC
)
ELSE @word -- 非漢字保留原字元 (英數、標點)
END;
SET @str = RIGHT(@str, LEN(@str) - 1);
END
RETURN @py;
END;
GO
| 技術點 | 說明 |
|---|---|
| Unicode 區間 | 0x4E00 (19968) ~ 0x9FA5 (40869) 涵蓋 20,902 個常用漢字。 |
| 對照表原理 | 每個聲母對應該聲母**最後一個**漢字(按拼音排序),利用 >= 找到首個大於等於目標字的聲母。 |
| Collation | Chinese_PRC_CS_AS_KS_WS:簡體中文、區分大小寫、重音、假名、寬度,**逐位元組比較**,確保排序與拼音順序一致。 |
| 非漢字處理 | 直接保留(如 'A'、'1'、'-'),適合混合字串。 |
SELECT dbo.fn_GetPinyinInitial(N'張三李四'); -- ZSLS
SELECT dbo.fn_GetPinyinInitial(N'ABC-123'); -- ABC-123
SELECT dbo.fn_GetPinyinInitial(N'長江大橋'); -- CJDQ
Pinyin.GetInitials) 或應用層處理。pinyin4net)。Chinese.Pinyin 套件。此函數適合「姓名縮寫」、「編碼前綴」、「簡易檢索」等**低頻、短字串**場景。生產環境若需高吞吐、多音字正確,請改用 CLR 或應用層專用庫。