【问题标题】:sql function to combine values into one stringsql函数将值组合成一个字符串
【发布时间】:2013-03-30 02:44:26
【问题描述】:

我有关于以下帖子的问题,我会添加它,但它不会让我,因为我是新人。

Link Here

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

我在下面有两个表,希望完成将 studentname 的 tblnames 转换为 tblCombineNames 转换为 Student 姓名。

请指教,谢谢!

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 小时才能运行 tblStudentNames 的 250730 条记录。我认为应该不会花那么长时间。

【问题讨论】:

标签: sql sql-server-2008


【解决方案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

【讨论】:

  • J W,你能看看我的原始帖子吗,我已经包含了表格以提供更好的示例。我不明白为什么更新需要这么长时间。
  • 您是否在 subjectID 列上设置了索引?
  • 我不确定你的意思,如果你的意思是进入表格设计并且是可索引的,是的。你介意再看一下我的帖子吗,我编辑了一些更有用的东西,可能更有意义,请指教,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多