SQL Server使用自定义函数结合游标实现数据行转列合并

南乔
南乔
发布时间:2026-10-15 | 2人浏览过
原创

在 SQL Server 数据库中,若需将特定组内的多行数据合并为一行(以逗号分隔),可以通过创建自定义函数并结合游标来实现。本文将展示具体的代码实现及运行逻辑。

目标与准备

假设有一张包含土地信息的表 land,数据结构如下:

  • landCode:标准宗地编码(唯一标识)
  • sectCode:所在区段编码(分组依据)

初始数据示例:

编号 标准宗地编码 (landCode) 所在区段编码 (sectCode)
1 131001BG001 G001
2 131001BG002 G001
3 131001BG003 G001
4 131001BG004 G002
5 131001BG005 G003

我们需要将上述数据转换为以下结果,即将同一 sectCode 下的 landCode 合并为一个以逗号分隔的字符串:

编号 区段编码 包含的标准宗地
1 G001 131001BG001,131001BG002,131001BG003
2 G002 131001BG004
3 G003 131001BG005

使用游标与函数实现合并

我们可以通过创建一个接收区段编码(@name)作为参数的自定义函数来达成目的。该函数内部使用游标遍历满足条件的记录,并将结果拼接。

具体实现代码如下:

CREATE FUNCTION combstr(@name nvarchar(50)) 
RETURNS nvarchar(300) 
AS 
BEGIN 
    DECLARE @resultStr nvarchar(300); -- 用于存储最终拼接的结果
    DECLARE @tempStr nvarchar(50);     -- 用于临时存储游标读取的每一条 landCode
    DECLARE @flag int;                 -- 用于判断是否为第一条数据,避免首尾多出逗号
    
    -- 定义游标,查询指定 sectCode 对应的所有 landCode
    DECLARE myCur CURSOR FOR 
        SELECT landCode FROM land WHERE sectCode = @name; 
    
    OPEN myCur;                       -- 打开游标
    FETCH NEXT FROM myCur INTO @tempStr; -- 将游标下移,读取第一条数据
    
    SET @flag = 0;
    SET @resultStr = '';              -- 初始化结果为空字符串

    -- 当游标状态正常时循环处理
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
        IF @flag = 0 
        BEGIN 
            -- 第一条数据直接赋值,不加前缀逗号
            SET @resultStr = @tempStr; 
        END 
        ELSE 
        BEGIN 
            -- 后续数据加上逗号再拼接
            SET @resultStr = @resultStr + ',' + @tempStr; 
        END 
        
        SET @flag = @flag + 1;        -- 增加计数器
        FETCH NEXT FROM myCur INTO @tempStr; -- 继续获取下一条数据
    END 
    
    CLOSE myCur;                      -- 关闭游标
    DEALLOCATE myCur;                 -- 释放游标资源
    RETURN @resultStr;                -- 返回拼接好的字符串
END

操作说明与注意事项

1. 参数传递:调用该函数时,传入需要分组的字段值,例如:SELECT dbo.combstr('G001')。

2. 逻辑解析:利用 @flag 变量判断当前处于第几条记录。如果是第一条(@flag=0),直接将读取的值赋给结果变量;否则,在原有结果后追加逗号和新的值。

3. 性能提示:虽然游标能直观地实现行转列逻辑,但在处理大规模数据时效率较低。SQL Server 2005+ 推荐使用 STUFF 配合 FOR XML PATH 的方式进行字符串聚合,执行速度通常优于游标方案。

以上就是在 SQL Server 中使用自定义函数以及游标进行数据行合并转换的详细内容,更多关于 SQL Server 高级数据处理技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表