例如这样一个字符串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 )

解决方案 »

  1.   

    create table SYS_User_Role(ROLE_ID int,DEPARTMENT_ID int)
    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
      

  2.   


    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)
      

  3.   

    print的结果insert into SYS_User_Role select 1,30 union all select 10353,32
      

  4.   

    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)
    */
      

  5.   

    改下符合楼主点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(  ROLE_ID,DEPARTMENT_ID ) select '+replace(replace(@s,'&',','),'~',' union all select ')print @sqlexec(@sql)
      

  6.   

    如果个数不确定的话,最好是在程序中写.
    使用循环,先找~,然后再找&
      

  7.   

    使用StringTokenizer tok = new StringTokenizer(spec, "~");进行两次操作,
    第一次取出行数据即:1&30和10353&32等等
    第二次取出列数据1,30;10353,32;并插入数据库inset into talbe_name values(1,30)
      

  8.   

    declare  @str varchar(800)  21
    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)
      

  9.   

    declare  @str varchar(8000)  
    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)
      

  10.   

    declare @str varchar(100), @sql varchar(1000)
    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