create table lease_stage(leaseid varchar(100),stage varchar(100))
go
insert into lease_stage
select 1000,       10 union all
select 1000,       20 union all
select 1000,       30 union all
select 1001,       10 union all
select 1001,       20
go
--写一个聚合函数:
create function dbo.fn_Merge(@f varchar(100))
returns varchar(8000)
as
begin
declare @r varchar(8000)
set @r=''
select @r=@r+ '|' + stage from lease_stage where leaseid=@f
return stuff(@r,1,1,'')
end
go-- 调用函数
select leaseid, dbo.fn_Merge(leaseid) as leaseid from lease_stage group by leaseidgo
drop table lease_stage
drop function fn_Merge

解决方案 »

  1.   

    create table lease_stage(leaseid varchar(100),stage varchar(100))
    go
    insert into lease_stage
    select 1000,       10 union all
    select 1000,       20 union all
    select 1000,       30 union all
    select 1001,       10 union all
    select 1001,       20
    go
    --写一个聚合函数:
    create function dbo.fn_Merge(@f varchar(100))
    returns varchar(8000)
    as
    begin
    declare @r varchar(8000)
    set @r=''
    select @r=@r+ '|' + stage from lease_stage where leaseid=@f
    return stuff(@r,1,1,'')
    end
    go-- 调用函数
    select leaseid, dbo.fn_Merge(leaseid) as stage from lease_stage group by leaseidgo
    drop table lease_stage
    drop function fn_Merge
    /*leaseid  stage
    -----------------------
    1000     10|20|30
    1001     10|20
    */
      

  2.   

    在SQL Server 2000中,使用函数处理是最简单的方法,还可以使用游标处理。
      

  3.   

    create table lease_stage(leaseid int,   stage int)
    insert lease_stage select 1000,        10
    insert lease_stage select 1000,        20
    insert lease_stage select 1000,        30
    insert lease_stage select 1001,        10
    insert lease_stage select 1001,        20--drop table lease_stagecreate function test_f(@leaseid int)
    returns varchar(200)
    as
    begin
    declare @s varchar(200)
    select @s=isnull(@s+'|','')+rtrim(stage) 
    from lease_stage where leaseid=@leaseid
    return @s
    endselect distinct leaseid,[stage]=dbo.test_f(leaseid) from lease_stageleaseid     stage                                                                                                                                                                                                    
    ----------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
    1000        10|20|30
    1001        10|20(所影响的行数为 2 行)
      

  4.   

    各位老大,不用function,一条sql能行不?因为我出来的结果还得和别的表join
      

  5.   

    在SQL Server 2000中,使用函数处理是最简单的方法,还可以使用游标处理。
      

  6.   

    游标就不要了,还是用function吧谢谢各位,一会结帖
      

  7.   

    在SQL Server 2000中,使用函数处理是最简单的方法,还可以使用游标处理。你创建函数后,用一条语句就可以查询出来了。-- 调用函数
    select leaseid, dbo.fn_Merge(leaseid) as stage 
    from lease_stage 
    group by leaseid
    /*leaseid  stage
    -----------------------
    1000     10|20|30
    1001     10|20
    */
      

  8.   

    2005的方法:
    declare @lease_stage table (leaseid int,   stage int)
    insert @lease_stage select 1000,        10
    insert @lease_stage select 1000,        20
    insert @lease_stage select 1000,        30
    insert @lease_stage select 1001,        10
    insert @lease_stage select 1001,        20SELECT *
    FROM(SELECT DISTINCT  leaseid
    FROM @lease_stage)A
    OUTER APPLY(SELECT [values]= STUFF(REPLACE(REPLACE( 
    (SELECT stage FROM @lease_stage N WHERE leaseid = A.leaseid
    FOR XML AUTO ), '<N stage="', '|'), '"/>', ''), 1, 1, ''))N
    (1 行受影响)
    leaseid     values
    ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1000        10|20|30
    1001        10|20(2 行受影响)
      

  9.   

    动态sql语句基本语法     
      1   :普通SQL语句可以用Exec执行     
        
      eg:       Select   *   from   tableName     
                        Exec('select   *   from   tableName')     
                        Exec   sp_executesql   N'select   *   from   tableName'         --   请注意字符串前一定要加N     
        
      2:字段名,表名,数据库名之类作为变量时,必须用动态SQL     
        
      eg:         
      declare   @fname   varchar(20)     
      set   @fname   =   'FiledName'     
      Select   @fname   from   tableName                             --   错误,不会提示错误,但结果为固定值FiledName,并非所要。     
      Exec('select   '   +   @fname   +   '   from   tableName')           --   请注意   加号前后的   单引号的边上加空格     
        
      当然将字符串改成变量的形式也可     
      declare   @fname   varchar(20)     
      set   @fname   =   'FiledName'   --设置字段名     
        
      declare   @s   varchar(1000)     
      set   @s   =   'select   '   +   @fname   +   '   from   tableName'     
      Exec(@s)                                 --   成功     
      exec   sp_executesql   @s       --   此句会报错     
        
        
        
      declare   @s   Nvarchar(1000)     --   注意此处改为nvarchar(1000)     
      set   @s   =   'select   '   +   @fname   +   '   from   tableName'     
      Exec(@s)                                 --   成功             
      exec   sp_executesql   @s       --   此句正确     
        
      3.   输出参数     
      declare   @num   int,     
                      @sqls   nvarchar(4000)     
      set   @sqls='select   count(*)   from   tableName'     
      exec(@sqls)     
      --如何将exec执行结果放入变量中?     
        
      declare   @num   int,     
                                    @sqls   nvarchar(4000)     
      set   @sqls='select   @a=count(*)   from   tableName   '     
      exec   sp_executesql   @sqls,N'@a   int   output',@num   output     
      select   @num