declare @i int
declare @str varchar(max)
set @i=0
set @str='88266,张三,12,十六,齐亮,NULL'+','
select  substring(@str,1,charindex(',',@str,1)-1),
substring(),substring()怎么截取出第二个,第三个。
想得到的格式是
列1    列2   列3 ……
88266  张三  12  ……能不能这样一句话写,我写了一个方法截取出来的结果是多行形式的,我现在需要是一行的。

解决方案 »

  1.   

    declare @i int ,@x int
    declare @sql varchar(1000)
    declare @str varchar(max)
    set @str='''88266'',''张三'',''12'',''十六'',''齐亮'',NULL'select @x=0,@i=len(@str)-len(replace(@str+',',',',''))
    while @x<=@i
    begin
        select @sql=isnull(@sql+',','')+'[列'+ltrim(@x)+'] varchar(100)'
        set @x=@x+1
    end
    exec('create table [Table]('+@sql+')')
    exec('insert [Table] select '+@str)
    select * from [Table]
      

  2.   


    create PROC pp_ @str VARCHAR(1000)
    AS 
    IF OBJECT_ID('[Table]') IS NOT NULL 
    DROP TABLE [Table]
    declare @i int ,@x int
    declare @sql varchar(1000)select @x=0,@i=len(@str)-len(replace(@str+',',',',''))
    while @x<=@i
    begin
        select @sql=isnull(@sql+',','')+'[列'+ltrim(@x)+'] varchar(100)'
        set @x=@x+1
    end
    exec('create table [Table]('+@sql+')')
    exec('insert [Table] select '+@str)
    select * from [Table]
    GO declare @str varchar(1000)
    set @str='''88266'',''张三'',''12'',''十六'',''齐亮'',NULL'exec pp_ @str 
    --result
    /*
    列0                             列1                             列2                             列3                             列4                             列5                             
    ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ 
    88266                          张三                             12                             十六                             齐亮                             NULL(所影响的行数为 1 行)*/
      

  3.   


    -- 投机取巧
    declare @str varchar(max);
    set @str='''88266'',''张三'',''12'',''十六'',''齐亮'',NULL';
    exec('select '+@str);
    /*
    88266 张三 12 十六 齐亮 NULL
    */
      

  4.   


    谢谢chuifengde提供的方法,根据你的方法我改写了一下,因为你的方法中要创建表,这个在实际中不方便,我改成了表变量。
    declare @i int ,@x int
    declare @sql varchar(1000)
    declare @str varchar(max)
    set @str='''88266'',''张三'',''12'',''十六'',''齐亮'',NULL'select @x=0,@i=len(@str)-len(replace(@str+',',',',''))
    while @x<=@i
    begin
        select @sql=isnull(@sql+',','')+'[列'+ltrim(@x)+'] varchar(100)'
        set @x=@x+1
    end
    exec('declare @tb table('+@sql+') 
    insert @tb select '+@str+' 
    select * from @tb')
      

  5.   

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_GetStr]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_GetStr]
    GO--分段截取函数(邹建)
    CREATE FUNCTION dbo.f_GetStr(
    @s varchar(8000),      --包含多个数据项的字符串
    @pos int,             --要获取的数据项的位置
    @split varchar(10)     --数据分隔符
    )RETURNS varchar(100)
    AS
    BEGIN
    IF @s IS NULL RETURN(NULL)
    DECLARE @splitlen int
    SELECT @splitlen=LEN(@split+'a')-2
    WHILE @pos>1 AND CHARINDEX(@split,@s+@split)>0
    SELECT @pos=@pos-1,
    @s=STUFF(@s,1,CHARINDEX(@split,@s+@split)+@splitlen,'')
    RETURN(ISNULL(LEFT(@s,CHARINDEX(@split,@s+@split)-1),''))
    END
    GO这个好像比较实用,推荐一下
      

  6.   

    declare @str varchar(max)
    set @str='88266,张三,12,十六,齐亮,NULL'select dbo.f_GetStr(@str,1,',') A,
    dbo.f_GetStr(@str,2,',') B,
    dbo.f_GetStr(@str,3,',') C,
    dbo.f_GetStr(@str,4,',') D,
    dbo.f_GetStr(@str,5,',') E,
    dbo.f_GetStr(@str,6,',') F
    /*
    A B C D E F
    88266 张三 12 十六 齐亮 NULL
    */
      

  7.   

    o(∩_∩)o   一语点醒梦中人啊,既然字符串都规整成这样了,还费事去想法把他转成表,o(︶︿︶)o 唉。
      

  8.   

    Alter Proc ProcA
    @Str VarChar(100) = ''
    As
     Declare @ColName VarChar(10),@Col VarChar(24),@II Int,@StrSql VarChar(1000),@JJ Int
     Set @JJ = 1  
     Set @ColName = '列' + Ltrim(Convert(VarChar(10),@JJ))
     Set @II = CharIndex(',',@Str)
     Set @Col = Left(@Str,@II - 1) If Right(@Str,1) <> ','
        Set @Str = @Str + ',' Set @StrSql = ' If Object_ID(''A'') Is Not Null ' +
                   ' Drop Table A' + 
                   ' Create Table A(' + @ColName + ' VarChar(10) Not Null Default '''')' + 
                   ' Insert Into A(' + @ColName + ') Select ''' + @Col + ''''
     Exec(@StrSql) Set @Str = Right(@Str,Len(@Str) - @II)
     Set @II = CharIndex(',',@Str) While @II > 0
       Begin
         Set @JJ = @JJ + 1
         Set @ColName = '列' + Ltrim(Convert(VarChar(2),@JJ))
         Set @Col = Left(@Str,@II - 1)
         Set @StrSql = ' Alter Table A '  + 
                       ' Add ' + @ColName + ' VarChar(10) Not Null Default '''''
         Exec(@StrSql)     Set @StrSql = ' Update A Set ' + @ColName + ' = ''' + @Col + ''''
         Exec(@StrSql)                     Set @Str = Right(@Str,Len(@Str) - @II)
         Set @II = CharIndex(',',@Str)
       End
    Select * From A
    Go
      
    --PRocA '88266,张三,12,十六,齐亮,NULL,'