You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:10:43