如何处理CTE中的所有记录

时间:2019-06-10 15:02:32

标签: for-loop common-table-expression

我正在尝试首先基于电子邮件合并多个公司,然后将表列拆分为多个列(由于使用此列的其他工具中的数据限制),并且按一定长度运行,这在我的逻辑上可以正常工作。唯一的问题是,这仅适用于1行。如何处理CTE的所有行。我正在阅读递归CTE,但我认为recrusvie CTE不适用于我的场景。在这种场景中使用CTE是错误的主意吗?还是有什么办法可以处理cte的所有行?

下面是我的代码,它适用于单行,但不适用于所有行。

创建过程[Add_NewSP] -在此处添加存储过程的参数 如     声明@ 255Chars VARCHAR(最大值)            ,@ removableChar整数            ,@ remianigString VARCHAR(最大值)            ,@ Company1 VARCHAR(最大值)            ,@ Company2 VARCHAR(最大)            ,@ Company3 VARCHAR(最大值)            ,@ Company4 VARCHAR(max)
           ,@ Company5 VARCHAR(最大)            ,@ Company6 VARCHAR(最大值)            ,@ Company7 VARCHAR(最大)            ,@ Company8 INTEGER            ,@ remainigChar VARCHAR(最大值)            ,@电子邮件varchar(max)     声明@cnt INT = 1;

开始       -添加了SET NOCOUNT ON以防止产生额外的结果集       -开始-干扰SELECT语句。       将nocount设置为ON;

    ;WITH contact_cte 
       AS (SELECT  
                  company, 
                  email, 

           FROM   [Table1] a 
                  INNER JOIN TableB b 
                          ON b.id = a.type_id 
                  ), 

 contact_cte_ext 
       AS (SELECT 
                  company, 
                  email, 
                  Stuff((SELECT ',' + company 
                         FROM   contact_cte AS t1 
                         WHERE  t1.email = t2.email 
                         FOR xml path ('')), 1, 1, '') campaign_company, 
                  Stuff((SELECT ',' + account 
                         FROM   contact_cte AS t1 
                         WHERE  t1.email = t2.email 
                         FOR xml path ('')), 1, 1, '') campaign_account 
           FROM   contact_cte AS t2) 



  SELECT @remianigString = campaign_company , @email= contact_email  FROM  contact_cte_ext 


  DECLARE @cntvar VARCHAR(10), @company VARCHAR(255) , @newCompany VARCHAR(max) = '' , @sqlCommand varchar(max)

  WHILE Len(@remianigString) > 0 

    BEGIN 

        SET @255Chars = LEFT(@remianigString, 255); 
            if(Len(@remianigString) > 255)
              Begin
                 SET @removableChar = Charindex(',', Reverse(@255Chars)) - 1 
                 PRINT '@removableChar length' +  Convert(varchar(10),  @removableChar);
              END ;
            ELSE 
              BEGIN
             SET @removableChar = -1 ;
              PRINT '@removableChar length' +  Convert(varchar(10),  @removableChar);
             END ;


        SET @company = Substring(@255Chars, 0, (Len(@255Chars) - @removableChar )); 
        SET @sqlCommand = 'Update table3  SET  company_' 
                          + Convert(varchar(10), @cnt)  
                          + '  =  '''   +  @company +   ''' ' 
                          +  'where contact_email = ''' +  @email 
                          + '''' ;
        PRINT @sqlCommand ;
        EXEC (@sqlCommand);


        print 'COMPANY' +  @company
            if(Len(@remianigString) > 255)
              Begin
                  SET @remianigString = Substring(@remianigString, Len(@company)+2,Len(@remianigString)-1); 
              END ;
            ELSE 
              BEGIN
                  SET @remianigString = Substring(@remianigString, Len(@company)+2,Len(@remianigString)); 
              END ;
       -- SET @remianigString = Substring(@remianigString, Len(@company)+2,Len(@remianigString)-1); 
        PRINT 'remoianingstring' +  @remianigString;
        SET @cnt = @cnt + 1; 

     END; 

END --EXEC Add_NEWSP

我要处理CTE中的所有行。现在,它只是在cte tabl中处理第一行。

这是数据示例 enter image description here

0 个答案:

没有答案