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

SQL Server兼容级别120下如何计算CSV格式字符串中所有数值的总和?

解决SQL Server兼容级别120下CSV字符串数值求和问题

既然你的SQL Server兼容级别卡在120没法用STRING_SPLIT,那咱们用几个替代方案来搞定CSV字符串里的数值求和。下面是三种可行的方法,你可以根据自己的场景选:

方法1:利用XML解析拆分字符串

这种方法不需要自定义函数,直接通过XML转换来拆分CSV,代码简洁:

DECLARE @csv VARCHAR(MAX) = '1,2,3,4,5';

SELECT SUM(CAST(SplitData AS INT)) AS TotalSum
FROM (
    SELECT 
        SplitData = y.i.value('(./text())[1]', 'VARCHAR(MAX)')
    FROM 
        (SELECT x = CAST('<i>' + REPLACE(@csv, ',', '</i><i>') + '</i>' AS XML)) AS a
    CROSS APPLY 
        x.nodes('i') AS y(i)
) AS SplitResults
WHERE ISNUMERIC(SplitData) = 1; -- 可选:过滤非数值项,避免转换报错

原理:把CSV字符串里的逗号替换成XML的节点标签,转成XML类型后,用nodes()方法拆分出每个元素,最后转换为数值类型求和。

方法2:递归CTE拆分字符串

如果你的CSV长度不是特别长,递归CTE也是个不错的选择:

DECLARE @csv VARCHAR(MAX) = '1,2,3,4,5';

WITH SplitCTE AS (
    SELECT 
        LEFT(@csv, CHARINDEX(',', @csv + ',') - 1) AS Value,
        STUFF(@csv, 1, CHARINDEX(',', @csv + ','), '') AS RemainingCSV
    UNION ALL
    SELECT 
        LEFT(RemainingCSV, CHARINDEX(',', RemainingCSV + ',') - 1) AS Value,
        STUFF(RemainingCSV, 1, CHARINDEX(',', RemainingCSV + ','), '') AS RemainingCSV
    FROM SplitCTE
    WHERE RemainingCSV > ''
)
SELECT SUM(CAST(Value AS INT)) AS TotalSum
FROM SplitCTE
WHERE ISNUMERIC(Value) = 1;

原理:每次递归拆分出第一个逗号前的数值,然后用STUFF去掉已拆分的部分,直到剩余字符串为空,最后汇总求和。

方法3:自定义字符串拆分函数

如果需要多次处理CSV字符串,创建一个可复用的自定义函数会更方便:
首先创建函数:

CREATE FUNCTION dbo.SplitCSV (@csv VARCHAR(MAX), @delimiter CHAR(1))
RETURNS @Results TABLE (Value VARCHAR(MAX))
AS
BEGIN
    DECLARE @pos INT;
    SET @csv = LTRIM(RTRIM(@csv)) + @delimiter;
    SET @pos = CHARINDEX(@delimiter, @csv);
    
    WHILE @pos > 0
    BEGIN
        INSERT INTO @Results (Value)
        SELECT SUBSTRING(@csv, 1, @pos - 1);
        
        SET @csv = SUBSTRING(@csv, @pos + 1, LEN(@csv));
        SET @pos = CHARINDEX(@delimiter, @csv);
    END
    
    RETURN;
END;

然后调用函数求和:

DECLARE @csv VARCHAR(MAX) = '1,2,3,4,5';
SELECT SUM(CAST(Value AS INT)) AS TotalSum
FROM dbo.SplitCSV(@csv, ',')
WHERE ISNUMERIC(Value) = 1;

原理:通过循环遍历CSV字符串,每次拆分出一个分隔符前的内容,存入表变量,最后查询表变量求和。

注意事项

  • 如果你的CSV里包含小数,记得把CAST(xxx AS INT)改成CAST(xxx AS DECIMAL(18,2))或者对应的数值类型。
  • ISNUMERIC函数可以过滤掉非数值的项,避免转换时出现报错,如果你的CSV确保全是数值,可以去掉这个条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:29:08