例如这样一个字符串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 )
"~"代表一条记录,"&"代表字段值
有多少个不确定,就是说不一定就是两条
就是拆分后插入到表中
拆分后
insert into SYS_User_Role ( ROLE_ID,DEPARTMENT_ID ) values ( 1,30 )
insert into SYS_User_Role ( ROLE_ID,DEPARTMENT_ID ) values ( 10353,32 )
gocreate 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
goexec sp_test '1&30~10353&32~'
goselect * from SYS_User_Role
/*
ROLE_ID DEPARTMENT_ID
----------- -------------
1 30
10353 32
*/
godrop 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 @sqlexec(@sql)
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)
*/
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( ROLE_ID,DEPARTMENT_ID ) select '+replace(replace(@s,'&',','),'~',' union all select ')print @sqlexec(@sql)
使用循环,先找~,然后再找&
第一次取出行数据即:1&30和10353&32等等
第二次取出列数据1,30;10353,32;并插入数据库inset into talbe_name values(1,30)
set @str = 1&30~10353&32~
set @str = repalce (replace(@str,'&',''','''),'~','''union all select ''')
set @str = 'select ''' + @str
set @str = reverse(stuff(reverse(@str),1,19,''))
insert into SYS_User_Role ( ROLE_ID,DEPARTMENT_ID )
exec(@str)
set @str = 1&30~10353&32~
set @str = repalce (replace(@str,'&',''','''),'~','''union all select ''')
set @str = 'select ''' + @str
set @str = reverse(stuff(reverse(@str),1,19,''))
insert into SYS_User_Role ( ROLE_ID,DEPARTMENT_ID )
exec(@str)
select @str = '1&30~10353&32~'
while charindex('~', @str) <> 0
begin
print 'insert into SYS_User_Role ( ROLE_ID,DEPARTMENT_ID ) values (' + left(@str, charindex('&', @str) - 1) + ',' + substring(@str, charindex('&', @str) + 1, charindex('~', @str) - charindex('&', @str) - 1) + ')'
set @str = right(@str, len(@str) - charindex('~', @str))
end