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
相关产品推荐
相关产品推荐

