sql函数将值组合成一个字符串

时间:2013-03-29 05:21:39

标签: sql sql-server-2008

关于以下帖子,我有一个问题,我会补充一下,但是因为我是新人,所以不会让我这么做。

Link Here

编辑添加特定类型的表格和更好的信息

我在下面有两个表格,希望将studentname的tblnames转换为tblCombineNames成为学生名称。

请指教,谢谢!

TblNames

ID(PK)          StudentType(FK) StudentNo(FK)   GradeNo(FK)     StudentName  
----------      ----------      ----------      ----------      -------------
1               1               1               1               Mary         
2               1               1               1               John         
3               1               1               1               Sam          
4               2               2               2               Alaina       
5               2               2               2               Edward       
6               2               2               2               Joe          

我希望输出低于

TblCombineNames

ID(PK)          StudentType(PK) StudentNo(PK)   GradeNo(PK)     StudentNames       
----------      ----------      ----------      ----------      -------------      
1               1               1               1               Mary, John, Sam    
2               2               2               2               Alaina, Edward, Joe

我会有一个名为

的标量值函数
---dbo.fn_Concatenate_Names
ALTER FUNCTION [dbo].[fn_Concatenate_Names]
(
    @StudentType VARCHAR(250),
    @StudentNo VARCHAR(250),
    @GradeNo VARCHAR(250)
)
RETURNS Varchar(250)
BEGIN
Declare @rtn Varchar(250)

BEGIN
    Select @rtn=(
    Select StudentNames + ', ' as 'data()'
    from tblStudentnames    
    where studentType = @StudentType and StudentNo = @StudentNo and GradeNo = @GradeNo
    for XML path('')
    )

    Set @rtn = LEFT(@rtn, Len(@rtn) - 1)
    END
    RETURN (@rtn)
END

我会做更新,比如调用函数

update tblCombineNames
set studentnames = fn_concatenate_names(StudentType,StudentNo,GradeNo)

它似乎可以工作,但需要2个小时才能在250730条记录的tblStudentNames上运行。我认为不应该花那么长时间。

1 个答案:

答案 0 :(得分:1)

您可以简单地将其放在子查询中,并使用表格JOIN将其放在

UPDATE  a
SET     a.names = b.StudentsList
FROM    tableName a
        INNER JOIN
        (
            SELECT  ST2.SubjectID, 
                    substring((SELECT ','+ ST1.StudentName
                            FROM dbo.Students ST1
                            WHERE ST1.SubjectID = ST2.SubjectID
                            ORDER BY ST1.SubjectID
                            For XML PATH ('')),2, 1000
                            ) StudentsList
            FROM    dbo.Students ST2
            GROUP   BY ST2.SubjectID
        ) b ON a.SubjectID = b.SubjectID
WHERE   a.SubjectID = @subjectid