csdn上有太多这样的例子了,自己搜索一下就可以了

解决方案 »

  1.   

    要求
    -----------------
    原表:表1
    xm        zw
    甲       校长
    甲       主任
    乙       副校长
    乙       副主任
    乙       办主任
    =====================================
    查询结果应该是:
    xm        zw
    甲       校长,主任       
    乙       副校长,副主任,办主任
    =====================================
    解答:
    1.先建立一个合并函数
    create function dbo.hb(@id varchar(100))
    return varchar(8000)
    as
    begin
    declare @str varchar(8000)
    set @str=''
    set select @str=@str+','+zw from 表1 where xm=@id
    set @str=right(@str,2,len(str)-1)
    return(@str)
    end
    2.调用
    select xm,dbo.hb(xm) as zw from 表1 -----正式---------
    --测试:
    create table 表A(xm varchar(10),zw varchar(10))
    insert into 表A select '甲','校长'
    insert into 表A select '甲','主任'
    insert into 表A select '乙','副校长'
    insert into 表A select '乙','副主任'
    insert into 表A select '乙','办主任'
    insert into 表A select '丙','办主任'
    insert into 表A select '定','办主任'go
    --1.创建一个合并的函数
    create function fmerg(@id varchar(10))
    returns varchar(8000)
    as
    begin
    declare @str varchar(8000)
    set @str=''
    select @str=@str+','+zw from 表A where xm=@id
    set @str=right(@str,len(@str)-1)
    return(@str)
    End
    go--2.调用自定义函数得到结果
    select distinct xm,dbo.fmerg(xm) as zw from 表A
    drop table  表A
      

  2.   

    “create function dbo.hb(@id varchar(100))
    return varchar(8000)
    as
    begin
    declare @str varchar(8000)
    set @str=''
    set select @str=@str+','+zw from 表1 where xm=@id
    set @str=right(@str,2,len(str)-1)
    return(@str)
    end”
    注意这个@str 的长度,否则当记录太多时,会自动截断后面超出长度的部分
      

  3.   

    存储过程:
    create proc P_test (@col sysname,@tb sysname)
    as 
    begin
    declare @str varchar(8000),
    @sqlstr nvarchar(4000)
    set @str=''
    set @sqlstr='select  @str=@str+'+@col+'+'','' from '+@tb+''
    exec sp_executesql @sqlstr,N'@str varchar(4000) out,@col sysname,@tb sysname',@str out,@col,@tb 
    set @str =left(@str,len(@str)-1)
    select @str as Return_str
    end
    create table table1 (data1 varchar(10),data2 varchar(10),data3 varchar(10))insert table1
    select '张三',   '98',      'class1'
    union all select '李四',   '100',     'class2'
    union all select '王五',    '99',     'class3'select * from table1
    --结果:
    张三 98 class1
    李四 100 class2
    王五 99 class3
    create table table2 (name varchar(8000))
    --=======================
    调用存储过程P_test:并把结果插入到table2:insert table2
    exec P_test 'data1','table1'
    --========================
    select * from table2
    --========================
    结果:
    张三,李四,王五
      

  4.   

    顺便提一下:当某字段的记录很多时,超过@str varchar(8000) 时,则返回的字段串会自动截断,显示不全所有该字段记录。
      

  5.   


    create table A([ID] int,姓名 int,图书 varchar(20))
    insert into A select 1, 1, '书'union select 2, 1, '书1' union select 3, 2, '书2' union select 4, 2, '书3'union select 5, 2, '书4' select * from A order by 姓名,图书
    --创建存储过程
    create proc p_t1asbegindeclare @t int,@图书 varchar(20)select 姓名,图书 as 总书目 into #t from A order by 姓名,图书 update #t set 总书目=@图书,@图书=case when 姓名=@t then @图书+','+总书目 else 总书目 end,@t=姓名
    select 姓名,max(总书目) 总书目 from #t group by 姓名
    end--执行exec p_t1