字符串拆分

半雨微凉丶 2018-07-31 02:44:28
比如传入'4,401,1;4,402,2;4,403,3'等不定量的几条数据,(4,401,1)是一条记录
现在,存储过程里使用charindex、substring已经拆分了4,401,1 4,402,2 4,403,3
但是下边进行下一级拆分的时候有没有简单的方法,比如使用递归什么的
DECLARE @arr VARCHAR(128)
DECLARE @Tlist1 VARCHAR(64)
DECLARE @posStart INT
DECLARE @posCur INT
DECLARE @TID INT

SET @posStart = 1
SET @posCur = 1

SET @arr = '4,401,1;4,402,2;4,403,3;4,404,4'
SET @posCur = CHARINDEX(';',@arr,@posStart)
set @Tlist1=cast (SUBSTRING(@arr,@posStart ,@posCur-@posStart) as varchar(64))
PRINT @Tlist1
--二次拆分 4,401,1 拆分为4 401 1
SET @posStart = @posCur

WHILE (@posStart+1 < LEN(@arr))
Begin
Set @posCur=CharIndex( ';',@arr, @posStart+1)
if(@posCur> 0)
Begin
set @Tlist1=cast (SUBSTRING(@arr,@posStart+1 ,@posCur-@posStart-1) as varchar(64))
PRINT @Tlist1
--二次拆分
SET @posStart = @posCur
End
else
Break
End
set @Tlist1=cast (SUBSTRING(@arr,@posStart+1 ,LEN(@arr)-@posStart+1) as varchar(64))
PRINT @Tlist1
--二次拆分
...全文
227 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 版主 2018-07-31
  • 打赏
  • 举报
回复
引用 4 楼 zhao3132453 的回复:
[quote=引用 3 楼 sinat_28984567 的回复:]
最后想要一个什么样的结果?

‘4,401,1;4,402,2;4,403,3’插入表中三条数据(这个3条是不定的,各组之间用;分割,每个成员用,分割)
4 401 1
4 402 2
4 403 3[/quote]
楼主自己的代码也实现了这个功能
IEEE_China 2018-07-31
  • 打赏
  • 举报
回复

--如果没有小数,可以把逗号改一下,
declare @s nvarchar(100)
declare @split nvarchar(10)
set @s='4,401,1;4,402,2;4,403,3;4,404,4'
set @split=';'

set @s=REPLACE (@s,',','.')

select PARSENAME(item,3) as ColA,
PARSENAME(item,2) as ColB,
PARSENAME(item,1) as ColC
from dbo.Fun_String2ToStringArray(@s,@split)


半雨微凉丶 2018-07-31
  • 打赏
  • 举报
回复
引用 5 楼 yenange 的回复:
[quote=引用 4 楼 zhao3132453 的回复:]
[quote=引用 3 楼 sinat_28984567 的回复:]
最后想要一个什么样的结果?

‘4,401,1;4,402,2;4,403,3’插入表中三条数据(这个3条是不定的,各组之间用;分割,每个成员用,分割)
4 401 1
4 402 2
4 403 3[/quote]
select item from dbo.Fun_String2ToStringArray('4,401,1;4,402,2;4,403,3;4,404,4',';')
这个不是已经达到你的效果了么?
还要怎么弄?[/quote]
可能我描述的不清楚,抱歉~
类似这样的
declare @list varchar(50)
set @list=''
while 1=1
begin
/*一级拆分*/
select top 1 @list=item from (select item from dbo.Fun_String2ToStringArray('4,401,1;4,402,2;4,403,3;4,404,4',';')as list where item>@list order by item
if @@ROWCOUNT=0
break
/*二级拆分*/
select item from dbo.Fun_String2ToStringArray(@list,',')
end

不过想了想,暂时不用分二级,可以直接把第一次的结果集插入进去。
感谢各位的指导,感激不尽!
吉普赛的歌 版主 2018-07-31
  • 打赏
  • 举报
回复
引用 4 楼 zhao3132453 的回复:
[quote=引用 3 楼 sinat_28984567 的回复:]
最后想要一个什么样的结果?

‘4,401,1;4,402,2;4,403,3’插入表中三条数据(这个3条是不定的,各组之间用;分割,每个成员用,分割)
4 401 1
4 402 2
4 403 3[/quote]
select item from dbo.Fun_String2ToStringArray('4,401,1;4,402,2;4,403,3;4,404,4',';')
这个不是已经达到你的效果了么?
还要怎么弄?
半雨微凉丶 2018-07-31
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
最后想要一个什么样的结果?

‘4,401,1;4,402,2;4,403,3’插入表中三条数据(这个3条是不定的,各组之间用;分割,每个成员用,分割)
4 401 1
4 402 2
4 403 3
二月十六 版主 2018-07-31
  • 打赏
  • 举报
回复
最后想要一个什么样的结果?
半雨微凉丶 2018-07-31
  • 打赏
  • 举报
回复
引用 1 楼 yenange 的回复:
用字符串分割函数吧, 手工写不合适, 太累又容易错, 没意义
IF OBJECT_ID('[dbo].[Fun_String2ToStringArray]') IS NOT NULL 
DROP FUNCTION [dbo].[Fun_String2ToStringArray]
GO
CREATE FUNCTION [dbo].[Fun_String2ToStringArray](@str NVARCHAR(MAX), @split NVARCHAR(10))
RETURNS @table TABLE ([item] NVARCHAR(max))
AS
BEGIN
IF LEN(@split) = 0
BEGIN
SET @split = N','
END

DECLARE @xml XML;
SET @xml = CONVERT(XML, '<x><![CDATA[' + replace(CONVERT(VARCHAR(MAX), @str), @split, ']]></x><x><![CDATA[') + ']]></x>')

INSERT INTO @table
SELECT item
FROM (SELECT c.value('text()[1]', 'nvarchar(4000)') [item]
FROM @xml.nodes('/x') t(c)) t
WHERE item IS NOT NULL

RETURN
END


这个两级分割的话怎么用?
select item from dbo.Fun_String2ToStringArray('4,401,1;4,402,2;4,403,3;4,404,4',';')
可以获得一个集合,然后游标遍历再使用一次分割函数吗
吉普赛的歌 版主 2018-07-31
  • 打赏
  • 举报
回复
用字符串分割函数吧, 手工写不合适, 太累又容易错, 没意义
IF OBJECT_ID('[dbo].[Fun_String2ToStringArray]') IS NOT NULL 
DROP FUNCTION [dbo].[Fun_String2ToStringArray]
GO
CREATE FUNCTION [dbo].[Fun_String2ToStringArray](@str NVARCHAR(MAX), @split NVARCHAR(10))
RETURNS @table TABLE ([item] NVARCHAR(max))
AS
BEGIN
IF LEN(@split) = 0
BEGIN
SET @split = N','
END

DECLARE @xml XML;
SET @xml = CONVERT(XML, '<x><![CDATA[' + replace(CONVERT(VARCHAR(MAX), @str), @split, ']]></x><x><![CDATA[') + ']]></x>')

INSERT INTO @table
SELECT item
FROM (SELECT c.value('text()[1]', 'nvarchar(4000)') [item]
FROM @xml.nodes('/x') t(c)) t
WHERE item IS NOT NULL

RETURN
END

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧