我正在尝试首先基于电子邮件合并多个公司,然后将表列拆分为多个列(由于使用此列的其他工具中的数据限制),并且按一定长度运行,这在我的逻辑上可以正常工作。唯一的问题是,这仅适用于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中处理第一行。