用在子查询中,如果有多条数据则把这些数据拼成一条来查询出来
例如 表1 学生信息( ID Name)
1 张三
表2 学生课程( PK StudentID Course)
1 1 高数
2 1 线代
然后通过一条查询得到
ID Name Course
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
--生成测试数据
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 张三 高数|线代
*/
--建立测试环境
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 张三 高数|线代
*/