DECLARE @sItem NVARCHAR(255)
select @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
while CHARINDEX(@sItem,N'          ')>0
select @sItem=replace(@sItem,N'          ',N'|')while CHARINDEX(@sItem,N' |')>0
select @sItem=replace(@sItem,N' |',N'|')while CHARINDEX(@sItem,N'| ')>0
select @sItem=replace(@sItem,N'| ',N'|')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,'|',N''') insert ##T values (N''')+N''')'
exec (@sql)select * from ##T     -----子串
select count(*) from ##T   ----子串的個數未测试!!!!!

解决方案 »

  1.   

    DECLARE @sItem NVARCHAR(255)
    select @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    while CHARINDEX(@sItem,N'          ')>0
    select @sItem=replace(@sItem,N'          ',N'|')while CHARINDEX(@sItem,N' |')>0
    select @sItem=replace(@sItem,N' |',N'|')while CHARINDEX(@sItem,N'| ')>0
    select @sItem=replace(@sItem,N'| ',N'|')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,'|',N''') insert ##T values (N''')+N''')'
    exec (@sql)select * from ##T     -----子串
    select count(*) from ##T   ----子串的個數未测试!!!!!
      

  2.   

    海兄,結果不正確。please try again. 
    :)
      

  3.   

    抛砖引玉,给一个最好想的做法把!
    DECLARE @sItem NVARCHAR(400),@tmp1 NVARCHAR(400),@space nchar(10),@int int,@count int
    begin
    set nocount on
    set @space = '          '
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    select @tmp1 = @sItem,@count = 0

    while(len(@sItem) > 0 and @sItem is not null)
    begin
    select @int = charindex(@space,@sItem)
    if @int > 0
    begin
    select @tmp1 = substring(@sItem,@int,400)
    select '['+substring(@sItem,1,@int - 1)+']'
    select @sItem = ltrim(@tmp1)
    select @count = @count + 1
    end
    else
    begin
    select '['+@sItem+']'
    select @sItem = ''
    select @count = @count + 1
    end
    end
    select @count
    set nocount off
    end
      

  4.   

    2 xzou(亡狼补齿) 兄:
       結果稍稍有錯。
      

  5.   

    DECLARE @sItem NVARCHAR(400)
    declare @len int
    declare @i int
    declare @k int
    declare @f int
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    set @len=len(@sItem)
    set @i=1
    set @k=0
    set @f=1
    while @len>=0 
    begin
    --select 'kk'+substring(@sItem,@i,1)
    if substring(@sItem,@i,1)=' '
      set @k=@k+1
    else
    begin
      if @k>=10 or @len=1
      begin
        select '['+rtrim(substring(@sItem,@f,@i-@f))+']'
        set @k=0
        set @f=@i
      end
      set @k=0
    end
    set @len=@len-1
    set @i=@i+1
    end
      

  6.   

    加一点处理
    DECLARE @sItem NVARCHAR(400),@tmp1 NVARCHAR(400),@space nchar(10),@int int,@count int
    begin
    set nocount on
    set @space = '          '
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    select @tmp1 = @sItem,@count = 0
    --加上全空格异常处理
    if @sItem = ''
    return
    while(len(@sItem) > 0 and @sItem is not null)
    begin
    select @int = charindex(@space,@sItem)
    if @int > 0
    begin
    select @tmp1 = substring(@sItem,@int,400)
    select '['+substring(@sItem,1,@int - 1)+']'
    select @sItem = ltrim(@tmp1)
    select @count = @count + 1
    end
    else
    begin
    select '['+@sItem+']'
    select @sItem = ''
    select @count = @count + 1
    end
    end
    select @count
    set nocount off
    end
      

  7.   

    to  xzou(亡狼补齿) 
       是結果有點不正確。你把 "最 好   的"分成兩個子串了,其實之間的空格數只有3個,不應該把它自分割。
      

  8.   

    先建个表:
    create table aaa(str varchar(2000) not null)
    下面是计算过程:
    declare @tmp varchar(1000)
    declare @strsql varchar(8000)
    select @strsql=''
    select @tmp=' Microsoft SQL    Server 2000                     最 好   的           RDBMS'
    select @strsql='insert into aaa values (ltrim('''+
         replace(replace(replace(@tmp,replicate(' ',10),'[]') ,'][',''),'[]',''')) insert into aaa values (ltrim(''')+
         '''))'
    exec (@strsql)
    --print @strsql
    select * from aaa    
    select count(*) from aaa
      

  9.   

    2 sasacat(傻傻猫) 
     你的結果正確。
      

  10.   

    呵,还是我自己发现错误了更正一下
    DECLARE @sItem NVARCHAR(400)
    declare @len int
    declare @i int
    declare @k int
    declare @f int
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    set @len=len(@sItem)
    set @i=1
    set @k=0
    set @f=1
    while @len>=0 
    begin
    if substring(@sItem,@i,1)=' '
      set @k=@k+1
    else
    begin
      if @k>=10 
      begin
        select '['+rtrim(substring(@sItem,@f,@i-@f))+']'
        set @k=0
        set @f=@i
      end
      if @len=1 
        select '['+rtrim(substring(@sItem,@f,@i-@f+2))+']'
      set @k=0
    end
    set @len=@len-1
    set @i=@i+1
    end 
      

  11.   

    2 icevi(按钮工厂):
      結果有誤...
    以下為SQL及計算結果:drop table aaa
    create table aaa(sItem varchar(2000) not null)
    set nocount on --下面是计算过程:
    declare @tmp varchar(1000)
    declare @strsql varchar(8000)
    select @strsql=''
    select @tmp=' Microsoft SQL    Server 2000                     最好      的           RDBMS'
    select @strsql='insert into aaa values (ltrim('''+
         replace(replace(replace(@tmp,replicate(' ',10),'[]') ,'][',''),'[]',''')) insert into aaa values (ltrim(''')+
         '''))'
     
    exec (@strsql)
    --print @strsql
    select * from aaa    
    select count(*) as Cnt  from aaa結果為:sItem                                                               ---------------------------------------------------- 
    Microsoft SQL    Server 2000
    最好 /*的字哪去了? */
    RDBMSCnt         
    ----------- 
    3
      

  12.   

    DECLARE @sItem NVARCHAR(400),@tmp nvarchar(30),@x nvarchar(400)
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'set @tmp=REPLICATE(' ',10)
    create table ##T1 (txt NVarchar(400))IF PATINDEX('%'+@tmp,@sItem)=0
    SET @sItem='['+@sItem
    IF PATINDEX(@tmp+'%',@sItem)=0
    SET @sItem=@sItem+']'
    set @tmp='%'+@tmp+'%'while PATINDEX(@tmp,@sItem)>0
    BEGIN
    SET @x=SUBSTRING(@sItem,1,PATINDEX(@tmp,@sItem))+']'
    INSERT ##T1 VALUES(@x)
    SET @sItem='['+LTRIM(RIGHT(@sItem,len(@sItem)-len(@x)))
    END
    IF LEN(@sItem)>1 
    INSERT ##T1 VALUES(@sItem)
    SELECT txt FROM ##T1 COMPUTE COUNT(txt)drop table ##t1
      

  13.   

    DECLARE @sItem NVARCHAR(400)
    declare @leftstring varchar(100)
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    declare @n intwhile (1=1)
    begin
       set @n=charindex(space(10),@sitem)
       if  @n>0
       begin 
    set  @leftstring=left(@sitem,@n)
    set  @sitem=right(@sitem,len(@sitem)-charindex(space(10),@sitem)-9)
       end  if @n=0
      begin
         print @sitem  
         break
      end
      if @n<>1
         print @leftstringend
    =============return
      Microsoft SQL   Server 2000 
     最 好   的
     RDBMS
      

  14.   

    DECLARE @sItem NVARCHAR(400),@tmp nvarchar(30),@x nvarchar(400)
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'set @tmp=REPLICATE(' ',10)
    create table ##T1 (txt NVarchar(400))IF PATINDEX('%'+@tmp,@sItem)=0 SET @sItem='['+@sItem

    IF PATINDEX(@tmp+'%',@sItem)=0 SET @sItem=@sItem+']'

    set @tmp='%'+@tmp+'%'while PATINDEX(@tmp,@sItem)>0
    BEGIN
    SET @x=SUBSTRING(@sItem,1,PATINDEX(@tmp,@sItem))+']'
    INSERT ##T1 VALUES(@x)
    SET @sItem='['+LTRIM(RIGHT(@sItem,len(@sItem)-len(@x)-1))
    END
    IF LEN(@sItem)>1 
    INSERT ##T1 VALUES(@sItem)
    SELECT txt FROM ##T1 COMPUTE COUNT(txt)drop table ##t1
      

  15.   

    DECLARE @sItem NVARCHAR(400),@tmp nvarchar(30),@x nvarchar(400)
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'set @tmp=REPLICATE(' ',10)
    create table ##T1 (txt NVarchar(400))IF PATINDEX('%'+@tmp,@sItem)=0 SET @sItem='['+@sItem

    IF PATINDEX(@tmp+'%',@sItem)=0 SET @sItem=@sItem+']'

    set @tmp='%'+@tmp+'%'while PATINDEX(@tmp,@sItem)>0
    BEGIN
    SET @x=RTRIM(SUBSTRING(@sItem,1,PATINDEX(@tmp,@sItem)))+']'
    INSERT ##T1 VALUES(@x)
    SET @sItem='['+LTRIM(RIGHT(@sItem,len(@sItem)-len(@x)))
    END
    IF LEN(@sItem)>1 
    INSERT ##T1 VALUES(@sItem)
    SELECT txt FROM ##T1 COMPUTE COUNT(txt)
      

  16.   


    DECLARE @sItem NVARCHAR(400)
    declare @leftstring varchar(100)
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    declare @n int
    declare @m int 
    set @m=0
    while (1=1)
    begin
       set @n=charindex(space(10),@sitem)
       if  @n>0
       begin 
    set  @leftstring=left(@sitem,@n)
    set  @sitem=right(@sitem,len(@sitem)-charindex(space(10),@sitem)-9)
       end  if @n=0
      begin     
         print @sitem  
         set @m=@m+1
         break
      end
      if @n<>1  
         begin  
         print @leftstring
         set @m=@m+1
         end
    endselect @m/*==============return==============
      Microsoft SQL   Server 2000 
     最 好   的
     RDBMS
                
    ----------- 
    3(所影响的行数为 1 行)*/
      

  17.   

    最精简的程序,但是不是最好的程序?:-)
    DECLARE @sItem NVARCHAR(400),@tmp nvarchar(30),@x nvarchar(400)
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'set @tmp='%'+REPLICATE(' ',10)+'%'
    create table ##T1 (txt NVarchar(400))
    while PATINDEX(@tmp,@sItem)>0
    BEGIN
    SET @x='['+RTRIM(SUBSTRING(@sItem,1,PATINDEX(@tmp,@sItem)))+']'
    INSERT ##T1 VALUES(@x)
    SET @sItem=LTRIM(RIGHT(@sItem,len(@sItem)-len(@x)))
    END
    IF LEN(@sItem)>1 
    INSERT ##T1 VALUES('['+@sItem+']')
    SELECT txt FROM ##T1 COMPUTE COUNT(txt)drop table ##t1
      

  18.   

    --跟 OpenVMS(半知半解) 学一招,加上一个rtrim
    DECLARE @sItem NVARCHAR(400)
    declare @leftstring varchar(100)
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    declare @n int
    declare @m int 
    set @m=0
    while (1=1)
    begin
       set @n=charindex(space(10),@sitem)
       if  @n>0
       begin 
    set  @leftstring=left(@sitem,@n)
    set  @sitem=rtrim(right(@sitem,len(@sitem)-charindex(space(10),@sitem)-9))
       end
      if @n=0
      begin     
         print @sitem  
         set @m=@m+1
         break
      end
      if @n<>1  
      begin  
         print @leftstring
         set @m=@m+1
      end
    end
    select @m
      

  19.   

    DECLARE @sItem NVARCHAR(400)
    declare @leftstring varchar(100)
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    declare @n int
    declare @m int 
    set @m=0
    while (1=1)
    begin
       set @n=charindex(space(10),@sitem)
       if  @n>0
       begin 
    set  @leftstring=left(@sitem,@n)
    set  @sitem=ltrim(right(@sitem,len(@sitem)-charindex(space(10),@sitem)-9))
       end
      if @n=0
      begin     
         print @sitem  
         set @m=@m+1
         break
      end
         print @leftstring
         set @m=@m+1
    end
    select @m
      

  20.   

    DECLARE @sItem NVARCHAR(400)
    declare @leftstring varchar(100)
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    declare @n int
    declare @m int 
    set @m=0
    while (1=1)
    begin
       set @n=charindex(space(10),@sitem)
       if  @n>0
       begin 
    set  @leftstring=left(@sitem,@n)
    set  @sitem=ltrim(right(@sitem,len(@sitem)-charindex(space(10),@sitem)-9))
       end
      if @n=0
      begin     
         print @sitem  
         set @m=@m+1
         break
      end
         print @leftstring
         set @m=@m+1
    end
    select @m
      

  21.   

    到此结束!就等着看 Yang_ 先生的做法
      

  22.   

    到此结束!就等着看 Yang_ 的做法了,谢谢庄主!
      

  23.   

    如果你想要横着的结果集 你就可以象下面这样写 
    DECLARE @sItem NVARCHAR(400)
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'SELECT @sItem=REPLACE(@sItem,'                  ',''',''' )
    SELECT @sItem=''''+REPLACE(@sItem,'        ',''',''' )+''''
    EXEC('SELECT '+@sItem )
      

  24.   

    DECLARE @sItem NVARCHAR(400)
    select @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    while CHARINDEX(@sItem,N'          ')>0
    select @sItem=replace(N'['+@sItem+N']',N'          ',N'][')while CHARINDEX(@sItem,N' ][')>0
    select @sItem=replace(@sItem,N' ][',N'][')while CHARINDEX(@sItem,N'][ ')>0
    select @sItem=replace(@sItem,N'][ ',N'][')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,N'][',N']'') insert ##T values (N''[')+N''')'
    exec (@sql)select * from ##T     -----子串
    select count(*) from ##T   ----子串的個數还是未测试!!!!!我没有了测试环境,飘香兄帮我测试一下。
      

  25.   

    DECLARE @sItem NVARCHAR(400)
    select @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    while CHARINDEX(@sItem,N'          ')>0
    select @sItem=replace(N'['+@sItem+N']',N'          ',N'][')
    while CHARINDEX(@sItem,N' ][')>0
    select @sItem=replace(@sItem,N' ][',N'][')while CHARINDEX(@sItem,N'][ ')>0
    select @sItem=replace(@sItem,N'][ ',N'][')while CHARINDEX(@sItem,N'][][')>0
    select @sItem=replace(@sItem,N' ][][',N'][')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,N'][',N']'') insert ##T values (N''[')+N''')'
    exec (@sql)select * from ##T     -----子串
    select count(*) from ##T   ----子串的個數还是未测试!!!!!我没有了测试环境,飘香兄帮我测试一下。
      

  26.   

    最后一稿,还是未测试:DECLARE @sItem NVARCHAR(400)
    select @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    while CHARINDEX(@sItem,N'          ')>0
    select @sItem=replace(N'['+@sItem+N']',N'          ',N'][')
    while CHARINDEX(@sItem,N' ][')>0
    select @sItem=replace(@sItem,N' ][',N'][')while CHARINDEX(@sItem,N'][ ')>0
    select @sItem=replace(@sItem,N'][ ',N'][')while CHARINDEX(@sItem,N'][][')>0
    select @sItem=replace(@sItem,N' ][][',N'][')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,N'][',N']'') insert ##T values (N''[')+N''')'
    exec (@sql)select * from ##T     
    select count(*) as cnt from ##T   ----子串的個數drop table ##T
      

  27.   

    海兄:
       仲還無得啊!
    CHARINDEX是把要搜索的字串放在第一個參數,第二個參數是被搜索的對象。:)2 gzhughie(hughie) :
      連續的空格數是不固定的,而且要的是得到子串。不是顯示的問題。
      

  28.   

    下面是竖着的结果 经过测试
    DECLARE @sItem NVARCHAR(400)
    SET @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'DECLARE @I INT
    DECLARE @S NVARCHAR(400)
    DECLARE @S1 NVARCHAR(400)
    CREATE TABLE #T (K NVARCHAR(400))
    SELECT @S1=REPLACE(@sItem,'        ',',' ),@I=1WHILE @I>-1
    BEGIN 
      SELECT @I=CHARINDEX(',',@S1)  
      SELECT @S=CASE WHEN @I=0 THEN @S1 ELSE LEFT(@S1,@I-1) END,@S1=CASE WHEN @I>=LEN(@S1) THEN '' ELSE RIGHT(@S1,LEN(@S1)-@I) END 
      IF @S>'' 
      INSERT INTO #T(K) VALUES(@S)  
      IF @I=0 SELECT @I=-1
    END
    SELECT * FROM #T
    DROP TABLE #T
      

  29.   

    to  N_chow(一劍飄香) :
    不可能的,我的代码肯定不会出这样的错误的,你在仔细运行一下,我这里毫无错误,不知道你是怎么测试出来这个错误的?
    -------------------------------------------------------------
    to  xzou(亡狼补齿) 
       是結果有點不正確。你把 "最 好   的"分成兩個子串了,其實之間的空格數只有3個,不應該把它自分割。
      

  30.   

    呵呵,低级错误,那掉过来对不对呀!我没法测试!DECLARE @sItem NVARCHAR(400)
    select @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    while CHARINDEX(@sItem,N'          ')>0
    select @sItem=replace(N'['+@sItem+N']',N'          ',N'][')
    while CHARINDEX(N' ][',@sItem)>0
    select @sItem=replace(@sItem,N' ][',N'][')while CHARINDEX(N'][ ',@sItem)>0
    select @sItem=replace(@sItem,N'][ ',N'][')while CHARINDEX(N'][][',@sItem)>0
    select @sItem=replace(@sItem,N' ][][',N'][')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,N'][',N']'') insert ##T values (N''[')+N''')'
    exec (@sql)select * from ##T     
    select count(*) as cnt from ##T   ----子串的個數drop table ##T
      

  31.   

    2 xzou(亡狼补齿):
      還是咱們先把環境列出來看看。這問題太有趣了,剛剛跟按鈕JJ已經Check出SQL Server的一個"Bug"來了。  我的環境:
         Windows 2K Server.
         MS SQL Server 2000  (沒有裝任何補丁)以下是您的程式在我機器上Run出來的結果:
                                                                                                                                                                                                                                                                     
    ---------------------------------------------------- 
    [  Microsoft SQL   Server 2000]                                                                                                                                                                                                                                                                 
    ---------------------------------------------------- 
    [最 好   ]                                                                                                                                                                                                                                                                 
    --------------------------------------------------- 
    [的]                                                                                                                                                                                                                                                                 
    --------------------------------------------------- 
    [RDBMS]            
    ----------- 
    4
      

  32.   

    不是我的错,按我的逻辑不会出现这样的错,大家可以测一下:
    declare @tmp nvarchar(2000)
    select @tmp=N' Microsoft SQL    Server 2000                     最 好   的          RDBMS'
    select replace(@tmp,replicate(' ',10),'[]')得到的结果是:
    Microsoft SQL    Server 2000[][] 最 好   []RDBMS这肯定是错的,但我觉得不是我的问题,不知道MSSQL为什么会把“的”字替换掉,我觉得是MSSQL的BUG,有兴趣的朋友可以用你们的版本试一下。至少目前我和飘香都发现这个问题了。
      

  33.   

    /*Yang_(扬帆破浪)的语句漂亮!!!!我帮他调试一下,如下:
    噢,你以改好了!.....不对!你的语句会死循环!
    在这一句:while CHARINDEX(N'][][',@sItem)>0
    select @sItem=replace(@sItem,N' ][][',N'][')
    ==========================*/DECLARE @sItem NVARCHAR(400)select @sItem='  Microsoft SQL   Server 2000                     最 好   的          RDBMS'
    while CHARINDEX(N'          ',@sItem)>0
    select @sItem=replace(N'['+@sItem+N']',N'          ',N'][')
    while CHARINDEX(N' ][',@sItem)>0
    select @sItem=replace(@sItem,N' ][',N'][')while CHARINDEX(N'][ ',@sItem)>0
    select @sItem=replace(@sItem,N'][ ',N'][')while CHARINDEX(N'][][',@sItem)>0 select @sItem=replace(@sItem,N'][][',N'][')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,N'][',N']'') insert ##T values (N''[')+N''')'
    exec (@sql)select * from ##T     
    select count(*) as cnt from ##T   ----子串的個數drop table ##T
      

  34.   

    見鬼啦﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗to  gzhughie(hughie) :  相信不,下面是你的SQL在我的機器上run出來的結果,看看與你的是否一樣:K                                                                                                                                       ---------------------------------------------------- 
      Microsoft SQL   Server 2000
         最 好                      /* 的字跑到哪去了?!!!*/
      RDBMS
      

  35.   

    这里面不知道left,right函数和substring函数速度哪个更快一些
    还有就是是不是用len()算出来具体的字符串长度有助于提高速度?
      

  36.   

    我现在没有环境,明天我把结果调出来,谁的认为逻辑的没有错的但sql server出错的我也可以把结果运行出来告诉你们结果
    我的环境是:
    win2000 server sp2
    sql server2000 sp2
      

  37.   

    我要撞牆啦!!!!!凡是用了REPLACE函數的都沒辦法得到正確的結果;
    海兄,j9988(j9988) :
      下面是你們的SQL在我電腦上的結果:("的”字同樣不見了!!)a 
    ------------------------------------------------
    [  Microsoft SQL   Server 2000]
    [最 好]
    [RDBMS]cnt         
    ----------- 
    3