LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

SQL Server自定义提取中文,简体中文,英文,数字函数汇总

admin
2026年4月15日 15:27 本文热度 51

在日常的数据库开发工作中,我们经常遇到需要从混杂的字符串中提取特定类型字符的场景。比如从地址中提取中文、从订单号中提取数字、从用户输入中过滤出英文等。今天给大家分享一套实用的SQL Server自定义函数,帮助您轻松应对这些需求。

一、提取中文字符

函数:dbo.getCN

这个函数利用Unicode编码范围(19968-40869)来识别中文字符,支持繁简体中文。

CREATE FUNCTION dbo.getCN(    @str AS NVARCHAR(4000))RETURNS NVARCHAR(4000)ASBEGIN    DECLARE @word NCHAR(1), @CN NVARCHAR(4000)    SET @CN = ''
    WHILE LEN(@str> 0    BEGIN        SET @word = LEFT(@str1)        -- Unicode中文字符范围:19968到40869        IF UNICODE(@wordBETWEEN 19968 AND 19968 + 20901            SET @CN = @CN + @word        SET @str = RIGHT(@str, LEN(@str- 1)    END
    RETURN @CNENDGO

测试示例

PRINT dbo.getCN('ASDKG论坛KDL')-- 结果:论坛
PRINT dbo.getCN('ASDKG論壇KDL')-- 结果:論壇
PRINT dbo.getCN('ASDKDL')-- 结果:(空)

二、提取数字

函数:dbo.getNumber

使用PATINDEX配合正则表达式模式,过滤掉所有非数字字符。

CREATE FUNCTION dbo.getNumber(@S VARCHAR(100))RETURNS VARCHAR(100)ASBEGIN    WHILE PATINDEX('%[^0-9]%'@S> 0    BEGIN        SET @S = STUFF(@S, PATINDEX('%[^0-9]%'@S), 1'')    END    RETURN @SENDGO

测试示例

PRINT dbo.getNumber('呵呵ABC123ABC')-- 结果:123

扩展技巧

如果需要保留逗号、星号等其他字符,可以在模式中添加:

-- 保留数字、逗号和星号PATINDEX('%[^0-9,*]%'@S> 0

三、提取英文字符

函数:dbo.getEn

提取字符串中的大小写英文字母(a-z)。

CREATE FUNCTION dbo.getEn(@S VARCHAR(100))RETURNS VARCHAR(100)ASBEGIN    WHILE PATINDEX('%[^a-z]%'@S> 0    BEGIN        SET @S = STUFF(@S, PATINDEX('%[^a-z]%'@S), 1'')    END    RETURN @SENDGO

测试示例

PRINT dbo.getEn('呵呵ABC123ABC')-- 结果:ABCABC

四、提取简体中文

函数:dbo.getSimplifiedCN

通过"吖-座"这个汉字范围来匹配简体中文字符。

CREATE FUNCTION dbo.getSimplifiedCN(@S NVARCHAR(100))RETURNS VARCHAR(100)ASBEGIN    WHILE PATINDEX('%[^吖-座]%'@S> 0        SET @S = STUFF(@S, PATINDEX('%[^吖-座]%'@S), 1, N'')    RETURN @SENDGO

测试示例

PRINT dbo.getSimplifiedCN('呵呵ABC123ABC')-- 结果:呵呵

五、过滤重复字符(带分隔符)

函数:dbo.distinct_str

适用于处理以特定分隔符连接的字符串,去重后保留原有顺序。

CREATE FUNCTION dbo.distinct_str(@S NVARCHAR(100), @SPLIT VARCHAR(50))RETURNS VARCHAR(100)ASBEGIN    IF @S IS NULL RETURN(NULL)
    DECLARE @NEW VARCHAR(50), @INDEX INT@TEMP VARCHAR(50)
    -- 确保字符串首尾都有分隔符    IF LEFT(@S1<> @SPLIT        SET @S = @SPLIT + @S    IF RIGHT(@S1<> @SPLIT        SET @S = @S + @SPLIT
    WHILE CHARINDEX(@SPLIT@S> 0 AND LEN(@S<> 1    BEGIN        SET @INDEX = CHARINDEX(@SPLIT@S)        SET @TEMP = LEFT(@S, CHARINDEX(@SPLIT@S@INDEX + LEN(@SPLIT)))
        IF @NEW IS NULL            SET @NEW = ISNULL(@NEW''+ @TEMP        ELSE            SET @NEW = ISNULL(@NEW''+ REPLACE(@TEMP@SPLIT''+ @SPLIT
        -- 删除所有重复项        WHILE CHARINDEX(@TEMP@S> 0        BEGIN            SET @S = STUFF(@S, CHARINDEX(@TEMP@S+ LEN(@SPLIT),                          CHARINDEX(@SPLIT@S, CHARINDEX(@TEMP@S+ LEN(@SPLIT)) - CHARINDEX(@TEMP@S), '')        END    END
    RETURN RIGHT(LEFT(@NEW, LEN(@NEW- 1), LEN(LEFT(@NEW, LEN(@NEW- 1)) - 1)ENDGO

测试示例

PRINT dbo.distinct_str('A,A,B,C,C,B,C,'',')-- 结果:A,B,C

测试示例

PRINT dbo.distinct_str2('AABCCD')-- 结果:ABCD

实际应用场景

  1. 数据清洗:从脏数据中提取有效信息

  2. 地址解析:分离省市县等中文信息和门牌号等数字信息

  3. 用户输入处理:过滤特殊字符,只保留需要的字符类型

  4. 数据去重:处理标签、分类等重复项

性能优化建议

  1. 对于大数据量的处理,建议使用CLR函数替代标量函数

  2. 可以考虑将这些函数改写成内联表值函数

  3. 在调用时注意数据类型匹配,避免隐式转换

结语

这些自定义函数虽然简单,但在日常开发中却非常实用。您可以根据实际需求进行修改和扩展,比如添加对大小写英文的支持、提取特定范围内的数字等。


阅读原文:原文链接


该文章在 2026/4/15 18:02:47 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-2  粤公网安备44030602007207号