create function f_str(@ID int)
returns varchar(8000)
AS
begin
  declare @ret varchar(8000)
  set @ret = ''
  select @ret = @ret+'|'+rtrim(Course) from 学生课程 where StudentID = @ID
  set @ret = case when len(@ret)>0 then stuff(@ret,1,1,'') else @ret end
  return @ret 
end
select
    a.ID,a.Name,Course=dbo.f_str(a.ID)
from
    学生信息 a
group by
    a.ID,a.Name

解决方案 »

  1.   

    --生成测试数据
    create table 学生信息(ID int,Name varchar(10))
    create table 学生课程(PK int,StudentID int,Course varchar(10))insert into 学生信息 select 1,'张三'insert into 学生课程 select 1,1,'高数'
    insert into 学生课程 select 2,1,'线代' 
    --创建自定义函数
    create function f_str(@ID int)
    returns varchar(8000)
    AS
    begin
      declare @ret varchar(8000)
      set @ret = ''
      select @ret = @ret+'|'+rtrim(Course) from 学生课程 where StudentID = @ID
      set @ret = case when len(@ret)>0 then stuff(@ret,1,1,'') else @ret end
      return @ret 
    end
    --调用自定义函数执行查询
    select
        a.ID,a.Name,Course=dbo.f_str(a.ID)
    from
        学生信息 a
    group by
        a.ID,a.Name
    /*
    --输出查询结果
    ID     Name      Course
    ----   ------    ---------
    1      张三      高数|线代
    */
      

  2.   

    楼上正解,楼主应该把此函数保存起来,CSDN里有过很多人问过这样的问题了.
      

  3.   

    --建立测试环境
    Create Table 学生信息
    (ID Int,
     Name Nvarchar(10))Create Table 学生课程
    (PK Int,
     StudentID Int,
     Course Nvarchar(20))
    --插入数据
    Insert 学生信息 Values(1,      N'张三')Insert 学生课程 Values(1,      1,             N'高数')
    Insert 学生课程 Values(2,      1,             N'线代')
    GO
    --建立函数
    Create Function GetCourse(@ID Int) 
    Returns Nvarchar(1000)
    As
    Begin
        Declare @S Nvarchar(1000)
        Set @S=''
        Select @S=@S+'|'+Course from 学生课程 Where StudentID=@ID Order By PK
        Return(Stuff(@S,1,1,''))
    End
    GO
    --测试
    Select *,dbo.GetCourse(ID) As Course from 学生信息
    --删除测试环境
    Drop Table 学生信息,学生课程
    Drop Function GetCourse
    --结果
    /*
    ID Name Course
    1 张三 高数|线代
    */