日期:2014-05-18  浏览次数:20473 次

一个含有分隔符的字符串,如何拆分后逐条插入到表中,内详,马上结贴
例如这样一个字符串1&30~10353&32~
"~ "代表一条记录, "& "代表字段值
有多少个不确定,就是说不一定就是两条
就是拆分后插入到表中
拆分后
insert   into   SYS_User_Role   (     ROLE_ID,DEPARTMENT_ID   )   values   (   1,30   )
insert   into   SYS_User_Role   (     ROLE_ID,DEPARTMENT_ID   )   values   (   10353,32   )

------解决方案--------------------
create table SYS_User_Role(ROLE_ID int,DEPARTMENT_ID int)
go

create procedure sp_test(@str varchar(8000))
as
begin
declare @n_str varchar(50)
while charindex( '~ ',@str)> 0
begin
set @n_str=replace(left(@str,charindex( '~ ',@str)-1), '& ', ', ')
set @str=stuff(@str,1,charindex( '~ ',@str), ' ')
exec( 'insert into SYS_User_Role(ROLE_ID,DEPARTMENT_ID) values( '+@n_str+ ') ')
end
end
go

exec sp_test '1&30~10353&32~ '
go

select * from SYS_User_Role
/*
ROLE_ID DEPARTMENT_ID
----------- -------------
1 30
10353 32
*/
go

drop procedure sp_test
drop table SYS_User_Role
go
------解决方案--------------------



declare @s varchar(30)
set @s= '1&30~10353&32~ '

if right(@s,1)= '~ '
set @s=left(@s,len(@s)-1)

declare @sql varchar(300)

set @sql= 'insert into SYS_User_Role select '+replace(replace(@s, '& ', ', '), '~ ', ' union all select ')

print @sql

exec(@sql)

------解决方案--------------------


if exists (select * from dbo.sysobjects where id = object_id(N '[dbo].[f_splitSTR] ') and xtype in (N 'FN ', N 'IF ', N 'TF '))
drop function [dbo].[f_splitSTR]
GO

--使用临时性分拆辅助表法
CREATE FUNCTION f_splitSTR(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
--创建分拆处理的辅助表(用户定义函数中只能操作表变量)
DECLARE @t TABLE(ID int IDENTITY,b bit)
INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns b

INSERT @re SELECT SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID)
FROM @t
WHERE ID <=LEN(@s+ 'a ')
AND CHARINDEX(@split,@split+@s,ID)=ID
RETURN
END
GO
declare @str varchar(8000)
set @str = '1&30~10353&32~ '
create table SYS_User_Role(ROLE_ID int,DEPARTMENT_ID int)
insert SYS_User_Role
select left(col,charindex( '& ',col)-1),right(col,len(col)-charindex( '& ',col)) from f_splitSTR(@str, '~ ') where charindex( '& ',col) > 0
select * from SYS_User_Role
go
drop table SYS_User_Role

/*

ROLE_ID DEPARTMENT_ID
----------- -------------
1 30
10353 32

(2 row(s) affected)
*/
------解决方案--------------------
如果个数不确定的话,最好是在程序中写.
使用循环,先找~,然后再找&
------解决方案--------------------
使用StringTokenizer tok = new StringTokenizer(spec, "~ ");进行两次操作,
第一次取出行数据即:1&30和10353&32等等
第二次取出列数据1,30;10353,32;并插入数据库inset into talbe_name values(1,30)
------解决方案--------------------