我有一函数:  CREATE  function  GetNames(@pid varchar)
  returns  varchar(8000)
  as
   begin
     declare @names varchar(1000)
     set @names = ''
     
     
        select @names = @names + ',' +  tag  from all_adv_cls where id in (@pid) 
        set @names  = stuff(@names ,1,1,'')
   
   return  @names
   end@pid 传进去是 1,2,3  为什么出来的 @names只有一个值,没有id对应的name1,name2,name3 ??帮助解决一下,先谢!

解决方案 »

  1.   

    CREATE function GetNames(@pid varchar)
    returns varchar(8000)
    as
    begin
    declare @names varchar(1000)
    set @names = ''
    select @names = @names + ',' + tag from all_adv_cls where charindex(','+id+',',','+@pid+',')>0
    set @names = stuff(@names ,1,1,'')return @names
    end
      

  2.   

    CREATE function GetNames(@pid varchar)
    returns varchar(8000)
    as
    begin
    declare @names varchar(1000)
    set @names = ''
    select @names = @names + ',' + tag from all_adv_cls where ','+@pid+',' like '%,'+id+',%'
    set @names = stuff(@names ,1,1,'')return @names
    end
      

  3.   

    表all_adv_cls 
    id  name
    1   a1
    2   a2
    3   a3SELECT dbo.GetNames('1,2,3') AS Expr1
    FROM all_advs  应该返回 a1,a2,a3 呀
      

  4.   

    可是函数里面用的是tag列,你这儿是name列
      

  5.   

    select @names = @names + ',' + tag from all_adv_cls
      

  6.   

    id in (@pid) 
    要么用
    charindex判断
    要么写成动态的 

    select @sql=...+ 'id in (' +@pid + ')'不然会把 @pid 看做一个整体...
      

  7.   

    charindex()
    patindex()
    都行
      

  8.   

    set @names = stuff(@names ,1,1,'')
    这个有问题
      

  9.   

    我写in 为什么不能列出 包含ID所有的name
      

  10.   

    数据有多少,什么意思? 
    表all_adv_cls 
    id  tag
    1   a1
    2   a2
    3   a3就这三个,也应该能列出 a1,a2,a3 呀
      

  11.   

    CREATE function GetNames(@pid varchar)
    ---------
    @pid只能是一个字符
      

  12.   

    改成
    CREATE function GetNames(@pid varchar(8000))
    ---------
    就可以啦.
      

  13.   

    对了,但用  select @names = @names + ',' +  tag  from all_adv_cls where id in (@pid)  会提示varchar转int出错?  为什么会有这样的出错 ? in 里面是字符串呀
      

  14.   

    alter function getname(@GID varchar(8000))
    returns varchar(8000)
    as
    begin
    declare @curState int
    declare @curKey varchar(50)
    declare @count int
    declare @name varchar(50)
    declare @names varchar(8000)
    set @curState=1
    set  @curKey = ''
    set @GID=@GID+','
    set @names=''
    while charindex(',',@GID,@curState) > 0
    begin
    set @count=charindex(',',@GID,@curState)
    set @count=@count-@curState
    Set @curKey = substring(@GID,@curState,@count)
    select @name=name from all_adv_cls where pid=@curKey
    set @names=@names+','+@name
    set @curState = charindex(',',@GID,@curState) + 1
    set @curKey = ''
    end
    return @names
    end
    执行:select dbo.getname('1,2,3')
      

  15.   

    select @names = @names + ',' + tag from all_adv_cls where id in (@pid) 
    id是什么类型的?
    如果是int类型就有问题,并且用id in (@pid)也不行,会把@pid作为一个整体来处理,亦即@pid是一个值,而不是几个值的集合.
      

  16.   

    set 只能给一个赋值,有多个时,就是最后一个。