SQL中使用+=赋值的While循环仅保留最后结果的问题
问题分析与解决
问题原因
你当前的循环代码存在逻辑错误:每次循环都会重新赋值@htmlSummary,而非在已有内容基础上追加新片段。具体表现为:
- 第一次循环:
@htmlSummary被设为第1行的HTML内容,随后执行@htmlSummary +=@htmlSummary,变量内容变为第1行内容的重复 - 第二次循环:
@htmlSummary被直接覆盖为第2行的HTML内容,再执行自增操作,最终变量仅保留最后一行内容的重复
修正方案
方案1:修正While循环逻辑
初始化@htmlSummary为空字符串,在循环中追加内容而非覆盖原有值:
DECLARE @htmlSummary NVARCHAR(MAX) = ''; DECLARE @cnt INT = 0; WHILE @cnt < 3 BEGIN -- 追加当前行的HTML片段,而非覆盖原有内容 SET @htmlSummary += '<p><h3>Express Orders</h3>' + COALESCE(REPLACE((SELECT HtmlCode FROM TempDataStore WHERE ID = @cnt + 1), '<table border="1" style="font-size:40px;', '<table class="table-sm table-striped"'), '') + '</p>'; SET @cnt = @cnt + 1; END SELECT @htmlSummary;
方案2:使用STRING_AGG高效聚合(SQL Server 2017及以上版本)
如果你的SQL Server版本支持STRING_AGG函数,推荐用这种更简洁高效的方式替代循环:
SELECT @htmlSummary = STRING_AGG( '<p><h3>Express Orders</h3>' + COALESCE(REPLACE(HtmlCode, '<table border="1" style="font-size:40px;', '<table class="table-sm table-striped"'), '') + '</p>', '' ) FROM TempDataStore ORDER BY ID; -- 按ID顺序聚合,保证与原循环逻辑一致 SELECT @htmlSummary;
额外注意事项
- 必须初始化
@htmlSummary为空字符串,避免初始值为NULL导致追加操作失效(NULL + 任意值 = NULL) - 若
TempDataStore中的ID不连续,建议优先使用STRING_AGG方案,或改用游标遍历所有行
内容的提问来源于stack exchange,提问作者Lukasz Bf
相关产品推荐
相关产品推荐

