如何通过求和查询更新SQL表中Name为'Total'的指定行
计算列总和并更新到指定行的SQL实现
需求:计算SqlInsertST2表中Class列之后所有列的数值总和(结果除以10000000),并将计算结果更新到表内Name = 'Total'的对应行中。
原代码问题分析
原代码拼接的UPDATE语句存在语法错误:SET子句缺少列名与计算值的对应关系,直接罗列SUM结果不符合UPDATE 表 SET 列名=值, 列名2=值2...的语法规范;另外ISNUMERIC函数对部分特殊字符(如货币符号)的判断不准确,建议改用更可靠的类型转换函数。
修正后的代码
DECLARE @sum_query NVARCHAR(MAX) = ''; -- 拼接每个列的更新片段:列名 = 该列的总和计算值 SELECT @sum_query = @sum_query + QUOTENAME(column_name) + ' = ISNULL(SUM(TRY_CONVERT(Float, ' + QUOTENAME(column_name) + '))/10000000, 0), ' FROM information_schema.columns WHERE table_name = 'SqlInsertST2' AND ordinal_position > (SELECT ordinal_position FROM information_schema.columns WHERE table_name = 'SqlInsertST2' AND column_name = 'Class'); -- 移除末尾多余的逗号 IF LEN(@sum_query) > 0 SET @sum_query = LEFT(@sum_query, LEN(@sum_query) - 1); -- 拼接完整的UPDATE语句 SET @sum_query = 'UPDATE ' + QUOTENAME('SqlInsertST2') + ' SET ' + @sum_query + ' WHERE Name = ''Total'''; -- 执行动态SQL EXEC sp_executesql @sum_query;
代码逻辑说明
- 遍历
Class列之后的所有列,为每个列生成列名 = 总和计算值的语句片段 - 使用
TRY_CONVERT替代ISNUMERIC,精准判断并转换数值类型,避免非数值内容转换报错 - 移除拼接过程中产生的末尾多余逗号,保证SQL语法合法
- 拼接完整的UPDATE语句并执行,完成指定行的数值更新
内容的提问来源于stack exchange,提问作者sagar raval
相关产品推荐
相关产品推荐

