参考如下问题的解答:
http://www.csdn.net/expert/topic/803/803752.xml?temp=.3938105

解决方案 »

  1.   

    --建立[FixStr]自定义函数,返回相应位置的字符串
    --@str:一个表达式,通常是一个用于搜索指定序列的列,即[cmd_result]的[content]列
    --@position:查询有特征字符隔开的第几个字符串,如[cmd_result]表中[id]=1,@position=1的是'Value1'
    --@StyleStr:特征字符,如'|'
    if exists(select * from sysobjects where [id]=object_id('FixStr'))
       drop function dbo.FixStr
    go
    create function FixStr(@str varchar(1000),@position  int,@StyleStr  varchar(10)) 
    returns varchar(1000)
    as
    begin
    declare @i int,@TmpPosi int
    If @position=0
        return ('')
    if charindex(@StyleStr,@str)=1
        set @TmpPosi=1
    else
       set @TmpPosi=0
    set @i=1
    While @i<@position
      begin  
        set @TmpPosi=charindex(@StyleStr,@Str,@TmpPosi+1)
        if @TmpPosi=0
           return ('')
        set @i=@i+1
      end
    return (substring(@str,@TmpPosi+1,case when charindex(@StyleStr,@str,@TmpPosi+1)=0 then len(@str)+1 else charindex(@StyleStr,@str,@TmpPosi+1) end-@TmpPosi-1))
    end
    go
    --构造动态SQL查询[cmd_result]表
    declare @i int,@TmpMax int
    declare @Tsql varchar(2000)
    set @Tsql='select cmd_id,'
    select @TmpMax=max(fieldcount) from Table_desp
    set @i=1
    while @i<=@TmpMax
       begin
         set @Tsql=@Tsql+'dbo.FixStr(content,'+cast(@i as varchar(5))+',''|'') as Field'+cast(@i as varchar(5))+','
         set @i=@i+1
       end
    set @Tsql=left(@Tsql,len(@Tsql)-1)+' from cmd_result'
    exec(@Tsql)
      

  2.   

    同时说明:
    2、sql server里没有数组变量的概念
    3、以前有些方法是用临时表的方法解决的,也很麻烦根据你的提醒用一个自定义函数来解决,发现还不错!
    其他更简单的方法就不知道了!
      

  3.   

    http://www.csdn.net/expert/topic/803/803752.xml?temp=.3938105是错误的连接
      

  4.   

    函数的修订版本:
    if exists(select * from sysobjects where [id]=object_id('FixStr'))
       drop function dbo.FixStr
    go
    create function FixStr(@str varchar(1000),@position  int,@StyleStr  varchar(10)) 
    returns varchar(1000)
    as
    begin
    declare @i int,@TmpPosi int
    If @position=0
        return ('')
    if charindex(@StyleStr,@str)=1
        set @TmpPosi=len(@StyleStr)+1
    else
       set @TmpPosi=1
    set @i=1
    While @i<@position
      begin  
        set @TmpPosi=charindex(@StyleStr,@Str,@TmpPosi)+len(@StyleStr)
        if @TmpPosi=len(@StyleStr)
           return ('')
        set @i=@i+1
      end
    return (substring(@str,@TmpPosi,case when charindex(@StyleStr,@str,@TmpPosi)=0 then len(@str)+1 else charindex(@StyleStr,@str,@TmpPosi) end-@TmpPosi))
    end