как обработать все записи в CTE - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь сначала объединить несколько компаний на основе электронной почты, а затем разбить столбец таблицы на несколько столбцов (из-за ограничения данных в другом инструменте, где будет использоваться этот столбец) с определенной длиной, которая прекрасно работает в моей логике.Единственная проблема, это работает только для 1 строки.Как я могу обработать все строки CTE.Я читал рекурсивную cte, но я не думаю, что recrusvie cte применима в моем scenerio.Неправильно ли использовать CTE в таком сценарии?или есть ли способ, которым я могу обработать все строки cte?

Ниже мой код, который работает для отдельных строк, но не для всех строк.

CREATE PROCEDURE [Add_NewSP] - Добавитьпараметры для хранимой процедуры здесь AS DECLARE @ 255Chars VARCHAR (макс.), @ removeableChar INTEGER, @ remianigString VARCHAR (макс.), @ Company1 VARCHAR (макс.), @ Company2 VARCHAR (макс.), @ Company3 VARCHAR (макс.), @ Company4 VARCHAR(макс.)
, @ Company5 VARCHAR (макс.), @ Company6 VARCHAR (макс.), @ Company7 VARCHAR (макс.), @ Company8 INTEGER, @ stayigChar VARCHAR (макс.), @ email varchar (макс.) DECLARE @cnt INT =1;

BEGIN - добавлено SET NOCOUNT ON, чтобы дополнительные наборы результатов не могли --Begin - мешать операторам SELECT.SET 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

...