Я пытаюсь сначала объединить несколько компаний на основе электронной почты, а затем разбить столбец таблицы на несколько столбцов (из-за ограничения данных в другом инструменте, где будет использоваться этот столбец) с определенной длиной, которая прекрасно работает в моей логике.Единственная проблема, это работает только для 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.
Вот пример данных