我对SQLserver 中STUFF函数的理解是在sql server中将字符串中的第一个字符串某一部分字符替换成另外一部分,组成新的字符串数据。

 

STUFF(character_expression,Start,Length,character_expression)

 

参数说明:

 

character_expression:字符串数据,或字符串组成的表达式。

 

Start:开始替换的位置,start 必须大于0,否则返回NULL.

 

Length,替换长度.若长度为0,则是拼接,不删除任何原字符串中的内容

 

character_expression:具体替换的内容,若为空的话,就是删除第一个字符串中的指定位置指定长度的数据。

 

如:

 

SELECT STUFF('123',1,0,'0')

 

则返回字符串"0123"

 

SELECT STUFF('123',1,2,'0')

 

则返回字符串"03"

 

SELECT STUFF('1234',2,2,'78')

 

则返回字符串"1784"

 

SELECT STUFF((SELECT '|'+DAID+','+DAName FROM TDesignAlter for xml path('')),1,1,'')

 

将每一行DAID和DAName用逗号连接起来,行与行之间用‘|’隔开,且去掉第一个字符串前面的‘|’

 

返回结果:000775B3-D035-4D59-8782-4DC4C3EE90F9,“中心项目”的设计变更14|004F92D8-FA39-4F77-80D5-D7169802F5BE,“中心项目”的设计变更1|006250CD-52DD-42C3-AB56-A1B56432B12C,“中心项目”的设计变JB-09|00AB74F1-BA91-4FB2-9EBC-D3521E4EFBDE,“中心项目”的设计变更2|00C45BCF-05BC-4376-AADE-AC2D12D2D032,“中心项目”T3-06
————————————————————————————————————————————————————————————————————————————————

 

 

 

第一种:《两张表》(年级课程两张表互相通过GradeID进行关联的)

select distinct(g.GradeID),g.GradeName,g.GradeNumber,

(SELECT STUFF(( SELECT ',' +convert(VARCHAR, ClassName) FROM Class c where c.GradeID = g.GradeID FOR XML PATH('')), 1, 1, '') AS UserName) as ClassName
FROM Grade g left join Class c on g.GradeID = c.GradeID;

效果展示:

 

第二种:《三张表》(年级课程和年级课程绑定表)

效果展示:

 

 第三种:《共五张表》年级课程两张表互相通过GradeID进行关联的-------年级表与课程表通过应该年级课程绑定表进行关联的

select ROW_NUMBER() over(order by a.GradeID asc) as xh,
a.GradeID,a.GradeName,a.GradeNumber,
(select STUFF(( SELECT ',' + CourseTitle FROM Curriculum b1 inner join GradeCurriculumBinding b2 on b1.CurriculumID = b2.CurriculumID where b2.GradeID = a.GradeID FOR XML PATH('')), 1, 1, '')) as CourseTitle,
(SELECT STUFF(( SELECT ',' +convert(VARCHAR, ClassName) FROM Class c1 where c1.GradeID = a.GradeID FOR XML PATH('')), 1, 1, ''))as ClassName
from Grade a order by a.GradeID;

效果展示: