數據清洗中常遇全角/半角混雜問題(如用戶輸入「123」vs「123」)。SQL Server 內建無此函數,需自定義標量函數通過 Unicode 碼位偏移實現。
CREATE FUNCTION dbo.F_Convert
(
@Str NVARCHAR(4000), -- 待轉換字符串
@Flag BIT -- 0=全角轉半角, 1=半角轉全角
)
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @Pat NVARCHAR(8), @Step INT, @I INT, @Spc INT;
IF @Flag = 0
BEGIN
-- 全角轉半角:匹配全角範圍 U+FF01~FF5E,偏移 -65248
SELECT @Pat = N'%[!-~]%', @Step = -65248,
@Str = REPLACE(@Str, N' ', N' '); -- 全角空格 U+3000 → 半角空格
END
ELSE
BEGIN
-- 半角轉全角:匹配半角可見字符 U+0021~007E,偏移 +65248
SELECT @Pat = N'%[!-~]%', @Step = 65248,
@Str = REPLACE(@Str, N' ', N' ');
END
-- 二進制排序規則確保按碼位匹配
SET @I = PATINDEX(@Pat COLLATE LATIN1_GENERAL_BIN, @Str);
WHILE @I > 0
BEGIN
SELECT @Str = REPLACE(@Str,
SUBSTRING(@Str, @I, 1),
NCHAR(UNICODE(SUBSTRING(@Str, @I, 1)) + @Step)),
@I = PATINDEX(@Pat COLLATE LATIN1_GENERAL_BIN, @Str);
END
RETURN @Str;
END;
GO
-- 全角轉半角
SELECT dbo.F_Convert(N'SQL Server 2019', 0);
-- 結果: SQL Server 2019
-- 半角轉全角
SELECT dbo.F_Convert(N'SQL Server 2019', 1);
-- 結果: SQL Server 2019
-- 批量更新表字段
UPDATE dbo.UserInput SET CleanValue = dbo.F_Convert(RawValue, 0);
| 字符集 | Unicode 範圍 | 偏移量 | 備註 |
|---|---|---|---|
| 半角可見字符 | U+0021 (!) ~ U+007E (~) | 基準 | 標準 ASCII 可打印字符 |
| 全角對應字符 | U+FF01 (!) ~ U+FF5E (~) | +65248 (0xFF00) | 全角 = 半角 + 0xFF00 |
| 半角空格 | U+0020 | - | 單獨處理 |
| 全角空格 | U+3000 | - | 單獨處理 |
CLR 函數(C# 實現,數量級更快)。內聯表值函數 (iTVF) + CROSS APPLY 向量化處理。若需支援日文片假名全角(U+FF66~FF9F)、圈字符等,擴展 @Pat 模式與偏移邏輯即可,核心原理不變。