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

SQL中如何拆分rabat_po_proizvodu字符串列并格式化为新行?

修正SQL游标实现折扣拆分输出

你现在的核心需求是把rabat_po_proizvodu字段的分号分隔字符串(比如10.0;20;30)拆成单独行,同时输出指定格式的内容。原代码存在两个关键问题:一是STRING_SPLIT和主表carts的关联逻辑错误(直接交叉连接会导致数据混乱),二是游标循环里没有输出逻辑,也没把cart_ID纳入查询范围。

下面是修正后的完整代码:

-- 定义所需变量,注意根据实际字段类型调整长度
declare @brojStavke int = 1;
declare @rbr varchar(4);
declare @art_sif varchar(50);
declare @kolicina int;
declare @rabat_po_proizvodu varchar(20);
declare @Cart_Id int; -- 需先赋值实际的cart_ID值
declare @rabati varchar(100); -- 需先赋值实际的折扣字符串,比如'10.0;20;30'

-- 修正游标查询:用cross apply确保拆分的折扣对应到正确的商品行,同时包含cart_ID
declare cursor_stavke cursor
for 
select 
    right(replicate(' ', 4) + rtrim(rbr), 4),
    art_sif0, 
    kolicina, 
    cart_ID,
    r.value as rabat_po_proizvodu 
from [SERVER-DELL].ZaObuku.[dbo].carts
cross apply STRING_SPLIT(@rabati,';') r
where cart_ID = @Cart_Id;

open cursor_stavke;
-- 先打印表头
print 'art_sif0 | kolicina | cart_ID | rabat_po_proizvodu';

fetch next from cursor_stavke into @rbr, @art_sif, @kolicina, @Cart_Id, @rabat_po_proizvodu;
while @@fetch_status = 0
begin
    -- 按指定格式输出每行内容,空格数可根据实际需求调整对齐效果
    print concat('         ', @art_sif, '            ', @kolicina, '            ', @rabat_po_proizvodu);
    set @brojStavke = @brojStavke + 1;
    fetch next from cursor_stavke into @rbr, @art_sif, @kolicina, @Cart_Id, @rabat_po_proizvodu;
end

close cursor_stavke;
deallocate cursor_stavke;

关键说明:

  • 用cross apply替代原代码的交叉连接,保证每个商品行和拆分后的折扣正确关联,避免数据错位。
  • 循环前先输出表头,循环内用concat拼接内容,确保格式符合要求。
  • 运行前需给@Cart_Id和@rabati赋值实际业务数据,否则查询无结果。

运行后会得到你需要的输出格式:

art_sif0 | kolicina | cart_ID | rabat_po_proizvodu
         10            10            10.0
         10            10            20
         10            10            30

内容的提问来源于stack exchange,提问作者Marko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:55:29