SQL Server中自定义函数:用指定的分隔符号分割字符串
微软SQL Server数据库中包含了很多内置的函数,入下图:
它们用于处理日期、数学、元数据、字符串等。
其中最为常用的就是处理字符串,里面包含了CharIndex()等函数,非常方便使用。
但是对于 特殊字符串的处理,比如:ISBN号 '978-7-5007-7234-7',如果想获取第三个与第四个分割符号之间的数字,
那么SQL 内置函数无法直接做到。这时就需要自定义函数。下面自定义三个函数,用于处理特殊的字符串。
1 ALTER FUNCTION [dbo].[Fun_GetStrArrayLength] 2 ( 3 @originalStr VARCHAR(1024), --要分割的字符串 4 @split VARCHAR(10) --分隔符号 5 ) 6 RETURNS INT 7 AS 8 BEGIN 9 DECLARE @location INT; --定义起始位置 10 DECLARE @start INT; --定义从第几个开始 11 DECLARE @length INT; --定义变量,用于接收计算元素的个数 12 13 SET @originalStr = LTRIM(RTRIM(@originalStr)); --去除字符串左右两侧的空格 14 15 SET @location = CHARINDEX(@split, @originalStr); --分割符号在字符串中第一次出现的位置(索引从1开始计数) 16 17 SET @length = 1; 18 19 WHILE @location <> 0 20 BEGIN 21 SET @start = @location + 1; 22 SET @location = CHARINDEX(@split, @originalStr, @start); 23 SET @length = @length + 1; 24 END 25 RETURN @length; 26 END
调用函数:select dbo.Fun_GetStrArrayLength('978-7-5007-7234-7','-')
结果:5
1 ALTER FUNCTION [dbo].[Fun_GetStrArrayStrOfIndex] 2 ( 3 @originalStr VARCHAR(1024), --要分割的字符串 4 @split VARCHAR(10), --分隔符号 5 @index INT --取第几个元素 6 ) 7 RETURNS VARCHAR(1024) 8 AS 9 BEGIN 10 DECLARE @location INT; --定义第一次出现分隔符号的位置 11 DECLARE @start INT; --定义开始位置 12 DECLARE @next INT; --定义下一个位置 13 DECLARE @seed INT; --定义分割符号的长度 14 15 SET @originalStr = LTRIM(RTRIM(@originalStr)); --去除字符串左右2侧空格 16 SET @start = 1; 17 SET @next = 1; 18 SET @seed = LEN(@split); 19 20 SET @location = CHARINDEX(@split, @originalStr); --第一次出现分隔符号的位置 21 22 WHILE @location <> 0 23 AND @index > @next 24 BEGIN 25 SET @start = @location + @seed; 26 SET @location = CHARINDEX(@split, @originalStr, @start); 27 SET @next = @next + 1; 28 END 29 30 IF @location = 0 31 BEGIN 32 SELECT @location = LEN(@originalStr) + 1; 33 END 34 35 --存在两种情况: 36 --1、字符串不存在分隔符号。 37 --2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。 38 39 RETURN SUBSTRING(@originalStr, @start, @location -@start); 40 END
调用函数:select dbo.Fun_GetStrArrayStrOfIndex('978-7-5007-7234-7','-',4)
结果:7234
1 ALTER FUNCTION [dbo].[Fun_SplitStr] 2 ( 3 @originalStr VARCHAR(8000), --要分割的字符串 4 @split varchar(100) --分隔符号 5 ) 6 RETURNS @temp TABLE(Result VARCHAR(100)) 7 AS 8 BEGIN 9 DECLARE @result AS VARCHAR(100); --定义变量用于接收单个结果 10 11 SET @originalStr = @originalStr + @split ; 12 13 WHILE (@originalStr <> '') 14 BEGIN 15 SET @result = LEFT(@originalStr, CHARINDEX(@split, @originalStr, 1) -1) ; 16 17 INSERT @temp VALUES(@result) ; 18 19 --STUFF()函数用于删除指定长度的字符,并可以在指定的起点处插入另一组字符。 20 SET @originalStr = STUFF(@originalStr, 1, CHARINDEX(@split, @originalStr, 1), ''); 21 END 22 RETURN 23 END
调用示例:select * from dbo.Fun_SplitStr('978-7-5007-7234-7','-')
结果: 978
7
5007
7234
7
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
BIMFace.SDK.NET
开源地址:https://gitee.com/NAlps/BIMFace.SDK
系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html
技术栈
1、AI、DeepSeek、MiniMax、通义千问
2、Visual Studio、.NET Core/.NET、MVC、Web API、RESTful API、gRPC、SignalR、Java、Python
3、jQuery、Vue.js、Bootstrap、ElementUI
4、数据库:分库分表、读写分离、SQLServer、MySQL、PostgreSQL、Redis、MongoDB、ElasticSearch、达梦DM、GaussDB、OpenGauss
5、架构:DDD、ABP、SpringBoot、jFinal
6、环境:跨平台、Windows、Linux
7、移动App:Android、IOS、HarmonyOS、微信小程序、钉钉、uni-app、MAUI
8、分布式、高并发、云原生、微服务、Docker、CI/CD、DevOps、K8S;Dapr、RabbitMQ、Kafka、RPC、Elasticsearch
欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。
出处:www.cnblogs.com/SavionZhang
作者:张传宁 技术顾问、培训讲师、微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。
专注于企业级通用开发平台、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。
多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。
熟悉中小企业软件开发过程:可行调研、需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业实现互联网转型升级全流程解决方案。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?