存储过程中分割内容

mjfei 2009-11-17 04:41:53
假如我的content字段有7个内容(tb,张三,IT,85622125,511122198002120014,四川成都,英语四级)

在存储过程中想将这条内容取出以","分割并存为另一个表的一条记录(7个字段)。请问该怎么分割呢?

...全文
111 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjfei 2009-11-18
  • 打赏
  • 举报
回复
truncate table Register

DECLARE @sm_id bigint, @content varchar(100),@sql varchar(1000),@mylen int --申明变量
--申明一个游标
DECLARE sms_cursor CURSOR FOR
SELECT sms_id, content FROM ms1 where left([content],charindex(',',[content])-1)='tb' and sms_id not in(select sms_id from Register)
--打开游标
OPEN sms_cursor
--取出值
FETCH NEXT FROM sms_cursor INTO @sm_id, @content
--循环取出游标的值
WHILE @@FETCH_STATUS = 0
BEGIN
set @mylen=(Len(@content)-Len(replace(@content,',','')))
Print @sm_id
Print @content
--print @mylen
Print ' '
if @mylen=4
Begin

SET @content=replace(@content,',',''',''')
--SET @SQL='SELECT COL='''+REPLACE(@content,',',''''+CHAR(10)+' UNION ALL SELECT ''')+''''
--insert into Register exec(@SQL)
set @sql='insert into Register (sms_id,sms_sign,R_name,R_age,R_zhiye,R_tel) values('''+cast(@sm_id as varchar)+''','''+@content+''')'
print @sql
exec (@sql)
end
else
Begin
print @mylen
end
--print @content
FETCH NEXT FROM sms_cursor
INTO @sm_id, @content
END
CLOSE sms_cursor --关闭游标
DEALLOCATE sms_cursor --释放游标
select * from Register

加了个长度判断,解决了,不知道这样做的效率怎么样。。。。
我的记录大概10w条左右。
mjfei 2009-11-18
  • 打赏
  • 举报
回复
truncate table Register

DECLARE @sm_id bigint, @content varchar(100),@sql varchar(1000)
DECLARE sms_cursor CURSOR FOR
SELECT sms_id, content FROM ms1 where left([content],charindex(',',[content])-1)='tb' and sms_id not in(select sms_id from Register)
OPEN sms_cursor
FETCH NEXT FROM sms_cursor INTO @sm_id, @content
WHILE @@FETCH_STATUS = 0
BEGIN
Print @sm_id
Print @content
Print ' '

SET @content=replace(@content,',',''',''')
set @sql='insert into Register (sms_id,sms_sign,R_name,R_age,R_zhiye,R_tel) values('''+cast(@sm_id as varchar)+''','''+@content+''')'
print @sql
exec (@sql)
FETCH NEXT FROM sms_cursor
INTO @sm_id, @content
END
CLOSE sms_cursor
DEALLOCATE sms_cursor
select * from Register

我用上面的测试成功,但目前有个问题,就是content内容分隔后与Register字段数不符合时会出错,想了一下,我觉得有两种做法,不知道对不对,望高手帮忙指点下。

1、记录下错误项(即content内容不符合我们要求的)的ID存入另一个表
判断@@error能实现吗?判断@@error值能否达到要求?

2、在取值时筛选掉content内容不符合要求的项,即
SELECT sms_id, content FROM ms1 where left([content],charindex(',',[content])-1)='tb' and sms_id not in(select sms_id from Register) 中再加判断项?我的想法是判断","的个数,不知道对不对?或者有没有其他更好的方法?

小弟先谢谢各位咯~~~
mjfei 2009-11-18
  • 打赏
  • 举报
回复
如果@STR字段少一个",",在插入的时候就会提示出错:插入错误: 列名或所提供值的数目与表定义不匹配。

这个问题怎么解决呢?谢谢!
SQL77 2009-11-18
  • 打赏
  • 举报
回复
DECLARE @STR VARCHAR(500)
DECLARE @SQL VARCHAR(5000)
SET @STR='tb,张三,IT,85622125,511122198002120014,四川成都,英语四级'
SET @SQL='SELECT COL='''+REPLACE(@STR,',',''''+CHAR(10)+' UNION ALL SELECT ''')+''''
PRINT @SQL

SELECT COL='tb'
UNION ALL SELECT '张三'
UNION ALL SELECT 'IT'
UNION ALL SELECT '85622125'
UNION ALL SELECT '511122198002120014'
UNION ALL SELECT '四川成都'
UNION ALL SELECT '英语四级'

然后INSERT TB EXEC(@SQL)
mjfei 2009-11-18
  • 打赏
  • 举报
回复
up一下....
lishq2008 2009-11-18
  • 打赏
  • 举报
回复
就是行列转换,建议看一下Pivoting和UnPivoting 语句。
mjfei 2009-11-17
  • 打赏
  • 举报
回复
declare @LongString varchar(50)
declare @FirstChar varchar(50)
declare @FirstPoint int
declare @lenth int

set @LongString='A,B,C,D,E,F,G'
set @lenth=len(@LongString)
create table #Temp_String(FID int identity,Content varchar(50))
set @FirstPoint=charindex(',',@LongString)

while( @FirstPoint>0)
begin
set @FirstChar=substring(@LongString,0,@FirstPoint)
insert into #Temp_String(Content) values (@FirstChar)
set @LongString=substring(@LongString,@FirstPoint+1,@lenth)
set @FirstPoint=charindex(',',@LongString)
end

insert into #Temp_String(Content) values (@LongString)
select * from #Temp_String
drop table #Temp_String

找了个这种方法,有两点不是很明白,麻烦知道的说下,谢谢
1、set @LongString='A,B,C,D,E,F,G' 怎么将值换成我现有表中的content内容,用select?

2、怎么将分割后的值存为一条记录(7个字段),不是存为7条记录。用数组得到值再取出存入7个字段?
icelovey 2009-11-17
  • 打赏
  • 举报
回复
学习
mjfei 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 happy_stone 的回复:]
精華帖有~~
[/Quote]

我去找找,谢谢
mjfei 2009-11-17
  • 打赏
  • 举报
回复
substring,stuff,charindex?

能否帮忙写个,谢谢!
--小F-- 2009-11-17
  • 打赏
  • 举报
回复
用字符分割函数
快乐_石头 2009-11-17
  • 打赏
  • 举报
回复
精華帖有~~

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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