SQL:如何引用动态列名称进行计算

时间:2019-02-15 03:40:00

标签: sql-server

我想在引用动态列时更新字段。 我们的目标是使流程自动化,因为该列每月都会引用更改。

例如,就像有不同的列,如month1,month2,month3到month24。每个月,只需要更新一列,但这是在另一个表中计算的运行编号。

所以我的问题是如何使查询动态化,以便每个月我只更新我想要的列号,而不更新另一个。

我尝试了以下脚本,但出现以下问题

  

将数据类型varchar转换为float时出错。

DECLARE @PromoMonthNumber VARCHAR(60)
DECLARE @PromoMonth VARCHAR(600)

SET @PromoMonthNumber = (SELECT CurrentDemandIndex FROM RidgeSys) --This refer to a number that change all the time
SET @PromoMonth = 'SELECT ABC.PromotionHistory' + @PromoMonthNumber


UPDATE ABC
SET @PromoMonth = table2.promotionhistory
FROM ABC
INNER JOIN (
    SELECT Article.code as code, sum(ROUND(@PromoMonth,0)) as promotionhistory 
    FROM Article
    INNER JOIN ABC ON DEF.articlecode = ABC.Articlecode
) as table2
ON ABC.articlecode = table2.code)

1 个答案:

答案 0 :(得分:1)

这是您的问题:

SELECT Article.code as code, sum(ROUND(@PromoMonth,0)) as promotionhistory 

由于@PromoMonth被定义为VARCHAR,因此,如果该值是非数字值,它将失败。这是一个示例:

这很好:

declare @x varchar(100) = '1';
select sum(round(@x,0));

结果:

1

此操作失败,并出现以上相同错误:

declare @x varchar(100) = 'x';
select sum(round(@x,0));

结果:

Msg 8114, Level 16, State 5, Line 3
Error converting data type varchar to float.

在进行计算之前,您需要检查该值是否为数字。