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

