我在使用的逻辑和所需的语法上遇到麻烦

时间:2019-09-17 15:12:49

标签: sql-server

我有一个表,我需要使用表中的DATETIMEDECIMAL(10,2)计算一些公式,到目前为止,我已经知道了:

ALTER PROCEDURE [dbo].[DEPRE]
AS
BEGIN
    DECLARE
        @FechaReg DATETIME = (SELECT Fec_ActivoDep FROM Dep_Act),
        @Fechahoy DATETIME = (SELECT GETDATE()),
        @MESES DATETIME,
        @Utililidad1 DECIMAL(10,2),
        @Utilidad2 DECIMAL(10,2),
        @IVA1 DECIMAL(10,2),
        @IVA2 DECIMAL(10,2),
        @Deprec1 DECIMAL(10,2),
        @Deprec2 DECIMAL(10,2),
        @Inversion1 DECIMAL(10,2),
        @Inversion2 DECIMAL(10,2),
        @Total DECIMAL(10,2),
        @Contador INT;

     SET @Fechahoy = (SELECT GETDATE());
     SET @FechaReg = (SELECT Fec_ActivoDep FROM Dep_Act);
     SET @MESES = (DATEDIFF(month, @FechaReg, @Fechahoy));

    SET @Utililidad1 = (0.08);
    SET @IVA1 = (0.16);

    SET @Inversion1 = (SELECT Dbl_MontoInv FROM Dep_Act);
    SET @Deprec1 = ((SELECT Dbl_MontoInv*(0.10) FROM Dep_Act));
    SET @Deprec2 = (SELECT(((@Inversion1) * ((((@Deprec1) / (12)) * ((SELECT CAST (@MESES AS INT))))))));
    SET @Utilidad2 = ((@Deprec2) * (@Utililidad1));
    SET @Inversion2 = ((@Inversion1) - (@Deprec2));
    SET @IVA2 = ((@Utilidad2) * (@IVA1));
    SET @Total = ((@Utilidad2) + (@IVA2));

BEGIN
    SELECT * FROM Dep_Act;

    IF @FechaReg <> @Fechahoy
    BEGIN
        PRINT 'Setting the param'

        UPDATE Dep_Act 
        SET Int_Meses = ((SELECT CAST (@MESES AS INT)));

        UPDATE Dep_Act 
        SET Dbl_Depreciacion = @Deprec2;

        UPDATE Dep_Act 
        SET Dbl_Inversion = @Inversion2;

        UPDATE Dep_Act 
        SET Dbl_Margen = @Utilidad2;

        UPDATE Dep_Act 
        SET Dbl_Iva = @IVA2;

        UPDATE Dep_Act 
        SET Dbl_TotalDep = @Total;
    END
    ELSE
    BEGIN
        PRINT 'All good'
    END;
END;
END;

运行此命令会给我这个错误:

  

消息512,级别16,状态1,过程dbo.DEPRE,行4,20、24、25 [批处理开始行2]
  子查询返回的值超过1。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

它使NULL的所有我试图更新的列。

如果在变量@FechaReg中具有这样的WHERE

@FechaReg DATETIME = (SELECT Fec_ActivoDep FROM Dep_Act WHERE Int_IdInmovilizado = 3),

它仅以指定的值运行,并正确计算DATEDIFF并使用该值更新所有表,但我尝试计算的其他值仍为NULL

如果有人可以告诉我我是否使用了错误的语法或者是我没有声明的内容,我将不胜感激,谢谢

1 个答案:

答案 0 :(得分:0)

要更正您的错误消息,只需执行以下操作: 代替

@Inversion1 = (SELECT Dbl_MontoInv FROM Dep_Act)

@Inversion1 = (SELECT TOP 1 Dbl_MontoInv FROM Dep_Act)

我不确定这是您想要的。 如果我理解正确,则希望更新表的每一行。 您应该进行大量的UPDATE运算,并使用CASE WHEN END和子查询进行计算(请不要忘记TOP 1)

如果没有表架构和对要执行的操作的充分理解,很难为您提供帮助。