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

SQL Server游标使用问题:拆分字符串无法生成正确单行数据

字符串拆分重复问题与游标工作原理解析

一、你的代码错误分析与修正

首先看你的问题:执行代码后1-A重复三次,其余数据正确,这是因为你没有对每条游标取出的字符串做完整的循环拆分。当前代码每拿到一条数据,只拆分一次就跳到下一条记录了,但像A,B,C这样的字符串需要拆分三次才能得到所有字符。

修正后的完整代码

CREATE TABLE Splitter ( Id INT ,Vals VARCHAR(10) )
INSERT INTO Splitter VALUES (1,'A,B,C'), (2,'D,E,F')

DECLARE @Id INT
DECLARE @Str VARCHAR(10)
DECLARE @Tbl TABLE(Id int, Vals varchar(10))

DECLARE MyCursor CURSOR FOR select Id, Vals from splitter
OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @Id, @Str

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 内部循环:拆分当前字符串的所有逗号分隔项
    WHILE CHARINDEX(',', @Str) > 0
    BEGIN
        -- 插入当前逗号前的字符
        INSERT INTO @Tbl SELECT @Id, SUBSTRING(@Str, 1, CHARINDEX(',', @Str)-1)
        -- 截断字符串,去掉已处理的部分
        SET @Str = SUBSTRING(@Str, CHARINDEX(',', @Str)+1, LEN(@Str))
    END
    -- 插入最后一个没有逗号的剩余字符
    INSERT INTO @Tbl SELECT @Id, @Str

    -- 获取下一条游标记录
    FETCH NEXT FROM MyCursor INTO @Id,@Str
END

CLOSE MyCursor
DEALLOCATE MyCursor

-- 输出你想要的格式结果
SELECT CONCAT(Id, '-', Vals) AS Result FROM @Tbl

关键修正点

  • 新增了内部WHILE CHARINDEX(',', @Str) > 0循环:只要当前字符串里还有逗号,就持续拆分出前面的字符插入临时表,同时截断字符串去掉已处理的部分。
  • 内部循环结束后,单独插入最后一个没有逗号的字符(比如A,B,C拆分两次后剩下C,必须单独插入才能完整获取所有项)。

执行这段修正后的代码,就能得到你想要的结果:

Result
------
1-A
1-B
1-C
2-D
2-E
2-F

二、游标(Cursor)的工作原理

游标是SQL里用来逐行处理查询结果集的工具,它就像一个可以在结果集里移动的指针,让你能对每一行数据单独操作。具体流程分6步:

  1. 声明游标:用DECLARE 游标名 CURSOR FOR 查询语句定义游标,指定要处理的结果集(比如你的select Id, Vals from splitter)。这一步只是定义规则,还没执行查询。
  2. 打开游标:OPEN 游标名会执行游标对应的查询,把结果集加载到内存里,此时游标指针停在结果集第一行的前面,准备开始获取数据。
  3. 获取行数据:FETCH NEXT FROM 游标名 INTO 变量列表把指针移动到下一行,同时把该行的字段值存入你定义的变量中。可以用系统函数@@FETCH_STATUS判断获取结果:
    • 0:成功拿到一行数据
    • -1:已经到结果集末尾,没有更多数据了
    • -2:要获取的行不存在(比如被其他事务删除)
  4. 循环处理:通过WHILE @@FETCH_STATUS = 0构建循环,每次处理当前行的数据,然后再次执行FETCH NEXT获取下一行,直到没有数据为止。
  5. 关闭游标:CLOSE 游标名会释放结果集占用的内存,但游标定义还在,之后可以再次打开使用。
  6. 释放游标:DEALLOCATE 游标名彻底删除游标定义,释放所有相关资源,之后就不能再使用这个游标了。

需要注意的是:游标是逐行处理,性能通常不如集合式操作(比如用CTE、字符串拆分函数实现字符串拆分),如果数据量较大,优先考虑集合操作哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:22:42