需要列更快CONCAT在SQL Server表(Need faster concat of colu

2019-09-22 02:13发布

在20万只加记录一个SQLServer表,我需要与其他列分组一些列数据的速度更快Concat的帮助。 例如, 样本数据和预期的结果如下所示

在这里,我需要Concat的最后一栏ColumnA, ColumnB, ColumnC作为管道分隔字符串,这四个一样的组合:

where KeyNumber=@strKeyNumber  and  Action=@strAction  and  Type=@strType  and  Code=@strCode

这四个是不同的组合。

我编写这个使用T-SQL STUFF功能,但实在是太慢了。 我还与while循环不同编码的,但即使是太慢了。

所以,我需要得到更快的结果帮。

在这些列A,B,C中的数据是长字符串,所以串联的字符串应该是类型nvarchar(max)

表中的原始数据(副本可以有一些列):

ID  KeyNumber   Action  Type    Code    ColumnA     ColumnB     ColumnC  
1   1111111111  AC1     TYPE1   CODE1   ValueA1     ValueB1     ValueC1 
2   1111111111  AC1     TYPE1   CODE1   ValueA2     ValueB2     ValueC2 
3   1111111111  AC1     TYPE1   CODE1   ValueA2     ValueB2     ValueC3 
4   1111111111  AC1     TYPE1   CODE1   ValueA3     ValueB3     ValueC4
5   2222222222  AC2     TYPE2   CODE2   ValA1       ValB1       ValC1   
6   2222222222  AC2     TYPE2   CODE2   ValA2       ValB2       ValC2
7   2222222222  AC2     TYPE2   CODE2   ValA3       ValB3       ValC3
8   2222222222  AC2     TYPE2   CODE2   ValA4       ValB4       ValC4
9   2222222222  AC2     TYPE2   CODE2   ValA4       ValB5       ValC4   

需要(在上面的表格应该不在这里重复重复的值)的结果数据到新表象下面这样:

ID  KeyNumber   Action  Type    Code    ColumnA                 ColumnB                         ColumnC  
1   1111111111  AC1     TYPE1   CODE1   ValueA1|ValueA2|ValueA3 ValueB1|ValueB2|ValueB3         ValueC1|ValueC2|ValueC3|ValueC4 
2   2222222222  AC2     TYPE2   CODE2   ValA1|ValA2|ValA3|ValA4 ValB1|ValB2|ValB3|ValB4|ValB5   ValC1|ValC2|ValC3|ValC4 

Answer 1:

您可以检查这一项:

DECLARE @Table TABLE
(
    ID BIGINT,
    Keynumber BIGINT,
    [Action] CHAR(3),
    [Type] CHAR(5),
    Code CHAR(5),
    ColumnA NVARCHAR(MAX),
    ColumnB NVARCHAR(MAX),
    ColumnC NVARCHAR(MAX)
)

INSERT INTO @TABLE(ID,Keynumber,[Action],[Type],Code,ColumnA,ColumnB,ColumnC)
VALUES   (1,1111111111,'AC1','TYPE1','CODE1','ValueA1','ValueB1','ValueC1') 
        ,(2,1111111111,'AC1','TYPE1','CODE1','ValueA2','ValueB2','ValueC2')
        ,(3,1111111111,'AC1','TYPE1','CODE1','ValueA2','ValueB2','ValueC3')
        ,(4,1111111111,'AC1','TYPE1','CODE1','ValueA3','ValueB3','ValueC4')
        ,(5,2222222222,'AC2','TYPE2','CODE2','ValA1','ValB1','ValC1')
        ,(6,2222222222,'AC2','TYPE2','CODE2','ValA2','ValB2','ValC2')
        ,(7,2222222222,'AC2','TYPE2','CODE2','ValA3','ValB3','ValC3')
        ,(8,2222222222,'AC2','TYPE2','CODE2','ValA4','ValB4','ValC4')
        ,(9,2222222222,'AC2','TYPE2','CODE2','ValA4','ValB5','ValC4')

SELECT   Keynumber
        ,[Action]
        ,[Type]
        ,Code
        ,(
             SELECT  ColumnA AS [text()]
             FROM    @Table TableOne
             WHERE    TableOne.Keynumber = TableTwo.Keynumber and  TableOne.[Action] = TableTwo.[Action] and  TableOne.[Type] = TableTwo.[Type]
             ORDER BY TableOne.ColumnA
             FOR XML PATH(''), TYPE
        ).value('/', 'NVARCHAR(MAX)') AS ColumnA
        ,(
             SELECT  ColumnB AS [text()]
             FROM     @Table TableOne
             WHERE    TableOne.Keynumber = TableTwo.Keynumber and  TableOne.[Action] = TableTwo.[Action] and  TableOne.[Type] = TableTwo.[Type]
             ORDER BY TableOne.ColumnB
             FOR XML PATH(''), TYPE
        ).value('/', 'NVARCHAR(MAX)') AS ColumnB
        ,(
            SELECT   ColumnC AS [text()]
            FROM     @Table TableOne
            WHERE    TableOne.Keynumber = TableTwo.Keynumber and  TableOne.[Action] = TableTwo.[Action] and  TableOne.[Type] = TableTwo.[Type]
            ORDER BY TableOne.ColumnC
            FOR XML PATH(''), TYPE
        ).value('/', 'NVARCHAR(MAX)') AS ColumnC

FROM(
        SELECT  DISTINCT Keynumber,[Action],[Type],Code
        FROM    @Table
    ) TableTwo

另外,我不知道你是用什么方法字符串连接。 您可以检查这个网站的其他方法:

http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/



Answer 2:

您是否知道CodePlex上有用户定义的聚合GROUP_CONCAT .Installation的一个开放源代码的CLR实现是你的服务器上运行的SQL脚本一样简单。

http://groupconcat.codeplex.com/

它有4个GROUP_CONCAT实施,是返回NVARCHAR(MAX)

  • GROUP_CONCAT --default定界符是,(逗号)

  • GROUP_CONCAT_D - 你可以指定分隔符

  • GROUP_CONCAT_DS - 你可以指定分隔符,排序顺序(1为递增顺序,2为倒序)

  • GROUP_CONCAT_S - 您可以指定排序顺序

    我觉得这是在性能方面非常不错。

在你的榜样,你会使用这样的

SELECT   Keynumber
    ,[Action]
    ,[Type]
    ,Code
    ,dbo.GROUP_CONCAT_DS(ColumnA,'|',1) AS ColumnA
    ,dbo.GROUP_CONCAT_DS(ColumnB,'|',1) AS ColumnB
    ,dbo.GROUP_CONCAT_DS(ColumnC,'|',1) AS ColumnC 
FROM YourTable
GROUP BY
     Keynumber
    ,[Action]
    ,[Type]
    ,Code


文章来源: Need faster concat of columns in sql server table