几种分割字符串实现方法的比较
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,在数据库开发中,有时会遇到把字符串,按一定规则进行分割,比如"a,b,c,1,2,3"这样的以逗号为分隔符的字符串,需要把分割出来,分割后单独变行一行记录。首先想到的是使用替换函数把分隔符去掉。于是有
千家信息网最后更新 2026年10月31日几种分割字符串实现方法的比较
在数据库开发中,有时会遇到把字符串,按一定规则进行分割,比如"a,b,c,1,2,3"这样的以逗号为分隔符的字符串,需要把分割出来,分割后单独变行一行记录。首先想到的是使用替换函数把分隔符去掉。于是有了:
IF (OBJECT_ID(N'Tempdb..##T1') IS NOT NULL)BEGIN DROP TABLE ##T1;ENDGODECLARE @string NVARCHAR(MAX);SET @string=N'123,abc,456,AAA,DDD';SET @string=N'SELECT * INTO ##T1 FROM (SELECT ''' + REPLACE(@string,',',''' AS result UNION ALL SELECT ''') + ''') a' ;EXEC(@string);SELECT * FROM ##T1;GO
Code-1: 方法1
该方法拼接SQL语句,简单巧妙,但有不足。(1)拼接的SQL不够直观,较难编写;(2)如果分隔符是半角的英文单引号的话,需要再作处理;(3)某些 情况下,如果字符串有中文等非英文字符,会显示乱码;(4)由于拼接的SQL,如果要分割的字符串很长很长,那么拼接的SQL可能会过长,而不能被执行。 所以这种方法只能作简单的替换或开拓思维之用。
方法2(推荐):
IF OBJECT_ID(N'fn_split_rowno') IS NOT NULLBEGIN DROP FUNCTION fn_split_rowno;ENDGOCREATE FUNCTION fn_split_rowno( @str NVARCHAR(MAX) ,@split NVARCHAR(20) = ',')RETURNS @t TABLE(row_no INT ,col NVARCHAR(500))ASBEGIN DECLARE @i INT SET @i = 0 WHILE (CHARINDEX(@split ,@str) <> 0) BEGIN INSERT @t (row_no,col) VALUES(@i + 1,SUBSTRING(@str ,1 ,CHARINDEX(@split ,@str) -1)) SET @str = STUFF(@str ,1 ,CHARINDEX(@split ,@str) + LEN(@split) -1 ,'') SET @i = @i + 1 END IF (@str <> '') INSERT @t (row_no,col) VALUES(@i + 1 ,@str) RETURNENDGO
Code-2: 方法2(推荐)
封装成函数,方便调用,并且不会出现方法1中的问题。
SELECT * FROM fn_split_rowno(N'123,abc,456,AAA,DDD,51CTO',',')
Code-3: 调用函数
方法3(来自网络):
DECLARE @string NVARCHAR(MAX)SET @string = N'123,abc,456,AAA,DDD,博客园'SELECT REPLACE(REVERSE((LEFT(s ,CHARINDEX(',' ,s)))) ,',' ,'') AS resultFROM ( SELECT r,REVERSE(LEFT(@string ,r)) + ',' AS s FROM ( SELECT ( SELECT COUNT(*) FROM sys.objects WHERE NAME <= t.name ) AS r FROM sys.objects AS t ) a WHERE r <= LEN(@string) AND LEFT(@string + ',' ,r + 1) LIKE '%,' ) tORDER BY rCode-3: 方法3
方法4(来自网络):
DECLARE @string NVARCHAR(MAX) SET @string = N'123,abc,456,AAA,DDD'DECLARE @idoc INT; DECLARE @doc XML; SET @doc = CAST('' + REPLACE(@string ,',' ,'') + ' ' AS XML)EXEC sp_xml_preparedocument @Idoc OUTPUT,@docSELECT * FROM OPENXML(@Idoc ,'/Root/item' ,2) WITH ([S] VARCHAR(10)) GOCode-4: 方法4
后面两种方法也是过于复杂,并且也有不足。
方法
字符
字符串
函数
分隔符
网络
英文
推荐
复杂
巧妙
直观
一行
不够
乱码
半角
博客
引号
思维
情况
数据
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
咖啡豆
博彦科技互联网金融
湖南永感互联网科技有限公司
中国互联网科技工作委员会毛军
互联网科技开发公司
互联网的科技创新
西安互联网科技公司
长亮科技 互联网金融
四川狮子座互联网科技
互联网科技宣传片
小米互联网科技园设置
受益于互联网科技的高速发展
互联网金融科技名词解释
科技赋能视角下互联网保险发展
保险科技服务互联网营销体系
中天科技中国工业互联网
广州互联网高科技取餐柜
国产互联网科技公司
互联网科技的前景
互联网科技创新方面的资料
广州大一互联网络科技有限公司
科技互联网产品
科技创新与互联网经济
互联网科技战争
互联网科技博客
昭通云南众福互联网科技有限公司
广州新华互联网科技学校电竞方面
山东星卡互联网科技有限公司官网
西安左小互联网科技有限公司
上海互联网科技园景观