create function fn_Linkman(
@Company varchar(30)

returns varchar(300)
as
begin
   declare @r varchar(300)
   set @r=''
   select @r=@r+'&++&'+isnull(Linkman,'') from 原始数据库 where Company=@Company group by Linkman
   if @r<>''
      set @r=stuff(@r,1,4,'')
   return @r
endgocreate function fn_Tel(
@Company varchar(30)

returns varchar(300)
as
begin
   declare @r varchar(300)
   set @r=''
   select @r=@r+'&++&'+isnull(Tel,'') from 原始数据库 where Company=@Company group by Tel
   if @r<>''
      set @r=stuff(@r,1,4,'')
   return @r
endgo
...--调用
select Company,dbo.fn_Linkman(Company) as Linkman,dbo.fn_Tel(Company) as Tel
from 原始数据库
group by Company

解决方案 »

  1.   

    楼上的,楼主要求的是去掉包含的记录
    而你的结果是
    Company Linkman                   Tel
    公司1 1P1+1P2&++&1P2&++&1P3 1T1&++&1T6
    公司2 2P1 2T1
    公司3 3P1&++&3P2 3T1要求的结果
    Company Linkman          Tel
    公司1 1P1+1P2&++&1P3 1T1&++&1T6
    公司2 2P1          2T1
    公司3 3P1&++&3P2 3T1
      

  2.   

    /*
    整理后数据库
    Company Linkman           Tel ……
    公司1 1P1+1P2&++&1P3 1T1&++&1T6
    公司2 2P1          2T1
    公司3 3P1&++&3P2 3T1
    */
    declare @t1 table(company varchar(20),linkman varchar(20),tel varchar(20))
    declare @tb table (company varchar(20),linkman varchar(4000),tel varchar(4000))
    insert into @t1
    select '公司1','1P1+1P2','1T1' union all
    select '公司2','2P1','2T1' union all
    select '公司3','3P1','3T1' union all
    select '公司1','1P2','1T6' union all
    select '公司1','1P3','1T1' union all
    select '公司3','3P2','3T1' union all
    select '公司2','2P1','2T1'
    --select * from @t1
    declare @col1 varchar(20),@col2 varchar(20),@col3 varchar(20)
    declare @ls1 varchar(20),@ls2 varchar(4000),@ls3 varchar(4000)
    declare cur cursor for 
    select Company,Linkman,Tel from @t1 order by company
    open cur
    fetch next from cur into @col1,@col2,@col3
    select @ls1=@col1,@ls2=@col2,@ls3=@col3
    while @@fetch_status=0
    begin
    if @col1<>@ls1 
    begin
    insert into @tb values(@ls1,@ls2,@ls3)
    select @ls1=@col1,@ls2=@col2,@ls3=@col3
    end
    else
    select @ls2=@ls2+(case when charindex(@col2,@ls2)>0 then '' else '&++&'+@col2 end),
    @ls3=@ls3+(case when charindex(@col3,@ls3)>0 then '' else '&++&'+@col3 end)fetch next from cur into @col1,@col2,@col3
    end
    deallocate cur
    insert into @tb values(@ls1,@ls2,@ls3)
    select * from @tb
      

  3.   

    可以只用一個函數實現,而且可以不使用游標。--創建函數
    Create Function F_TEST(@company Varchar(20), @Flag Bit)
    Returns Varchar(8000)
    As
    Begin
    Declare @S Varchar(8000)
    Select @S = ''
    If(@Flag = 0)
    Select @S = @S + (Case When CharIndex(linkman, @S) > 0 Then '' Else '&++&' + linkman End) From TEST Where company = @company
    Else
    Select @S = @S + (Case When CharIndex(tel, @S) > 0 Then '' Else '&++&' + tel End) From TEST Where company = @company
    Select @S = Stuff(@S, 1, 4, '')
    Return @S
    End
    GO
    --測試
    Select
    company,
    dbo.F_TEST(company, 0) As linkman,
    dbo.F_TEST(company, 1) As tel
    From
    TEST
    Group By
    company
    GO
      

  4.   

    --創建環境
    Create Table TEST
    (company Varchar(20),
     linkman Varchar(20),
     tel Varchar(20))
    Insert Into TEST
    Select '公司1','1P1+1P2','1T1' Union All
    Select '公司2','2P1','2T1' Union All
    Select '公司3','3P1','3T1' Union All
    Select '公司1','1P2','1T6' Union All
    Select '公司1','1P3','1T1' Union All
    Select '公司3','3P2','3T1' Union All
    Select '公司2','2P1','2T1'
    GO
    --創建函數
    Create Function F_TEST(@company Varchar(20), @Flag Bit)
    Returns Varchar(8000)
    As
    Begin
    Declare @S Varchar(8000)
    Select @S = ''
    If(@Flag = 0)
    Select @S = @S + (Case When CharIndex(linkman, @S) > 0 Then '' Else '&++&' + linkman End) From TEST Where company = @company
    Else
    Select @S = @S + (Case When CharIndex(tel, @S) > 0 Then '' Else '&++&' + tel End) From TEST Where company = @company
    Select @S = Stuff(@S, 1, 4, '')
    Return @S
    End
    GO
    --測試
    Select
    company,
    dbo.F_TEST(company, 0) As linkman,
    dbo.F_TEST(company, 1) As tel
    From
    TEST
    Group By
    company
    GO
    --刪除測試環境
    Drop Table TEST
    Drop Function F_TEST
    --結果
    /*
    company linkman tel
    公司1 1P1+1P2&++&1P3 1T1&++&1T6
    公司2 2P1 2T1
    公司3 3P1&++&3P2 3T1
    */
      

  5.   

    看看这个
    http://topic.csdn.net/t/20041129/14/3598139.html
    关注
      

  6.   

    个人觉得把函数改为存储过程 可以执行动态SQL 语句
    应该 不用写2个以上函数  做什么判断了