【问题标题】:Division inside Insert stored procedure T-SQL插入存储过程T-SQL里面的除法
【发布时间】:2013-03-12 21:14:06
【问题描述】:

我是 T-SQL 的新手,我想知道是否可以做这样的事情

CREATE PROCEDURE [SISACT].[new_activo_fijo]
  @activo VARCHAR(8) ,
  @descripcion VARCHAR(60) ,
  @utiliza_serial BIT,
  *@serial VARCHAR(20) = NULL,*
  @fecha_adquisicion DATE,
  @referencia VARCHAR(10),
  @costo_adquisicion FLOAT,
  @vida_util INT,
  **@saldo_a_depreciar FLOAT = @costo_adquisicion / @vida_util,**
  @ultimo_periodo CHAR(6),
  *@periodo_saldo_cero CHAR(6) = NULL,*
  @fecha_incorporacion DATE,
  @fecha_desincorporacion DATE,
  @proveedor VARCHAR(8),
  @situacion INT
AS
INSERT INTO [SISACT].[ACTIVOS_FIJOS] (
activo, descripcion, utiliza_serial, serial, fecha_adquisicion, 
referencia, costo_adquisicion, vida_util, saldo_a_depreciar,
ultimo_periodo, periodo_saldo_cero, fecha_incorporacion,
fecha_desincorporacion, proveedor, situacion
)
VALUES(
  @activo, @descripcion, @utiliza_serial, @serial, @fecha_adquisicion,
  @referencia, @costo_adquisicion, @vida_util, @saldo_a_depreciar, 
  @ultimo_periodo, @periodo_saldo_cero,  @fecha_incorporacion,
  @fecha_desincorporacion, @proveedor, @situacion
)

另外,是否可以像我一样将参数初始化为 NULL,以防万一没有从表单发送,或者我应该在发送参数时这样做?

很抱歉,如果我问的是一些非常基本的问题,我将不胜感激。

以防万一,我使用的是 PHP 和 ODBC

【问题讨论】:

    标签: sql-server tsql stored-procedures odbc sql-server-2008-express


    【解决方案1】:

    根据实验,这是我发现的:

    1. 你能做到吗:@saldo_a_depreciar FLOAT = @costo_adquisicion / @vida_util。答:,SQL Server(在我的例子中是 2012 年)说 Incorrect syntax near '/'。用括号括起来(绝望的最后手段:-)也没有帮助。

    2. 你能做到吗:@periodo_saldo_cero CHAR(6) = NULL。答:是的,如果@periodo_saldo_cero没有被传递,则默认为NULL。

    至于您的@saldo_a_depreciar 列:它是否总是定义为@costo_adquisicion / @vida_util?如果是这样,您应该根据需要计算它而不是存储它。

    如果@saldo_a_depreciar真的是一个应该存储而不是计算的值,你只需要将计算推入过程代码而不是参数列表:

    CREATE PROCEDURE [SISACT].[new_activo_fijo]
      @activo VARCHAR(8) ,
      @descripcion VARCHAR(60) ,
      @utiliza_serial BIT,
      @serial VARCHAR(20) = NULL,
      @fecha_adquisicion DATE,
      @referencia VARCHAR(10),
      @costo_adquisicion FLOAT,
      @vida_util INT,
      @saldo_a_depreciar FLOAT = NULL
      @ultimo_periodo CHAR(6),
      @periodo_saldo_cero CHAR(6) = NULL,
      @fecha_incorporacion DATE,
      @fecha_desincorporacion DATE,
      @proveedor VARCHAR(8),
      @situacion INT
    AS
      IF @saldo_a_depreciar IS NULL SET @saldo_a_depreciar = @costo_adquisicion / @vida_util
      INSERT INTO ... (and the rest of your procedure)
    

    这将在两种情况下计算@saldo_a_depreciar:(1) 如果您不传递参数,以及 (2) 如果您将参数作为 null 传递。

    【讨论】:

      【解决方案2】:

      默认情况下,您绝对可以将单个参数初始化为 NULL - 但我认为您不能在参数列表中执行此操作。

      我会做以下事情:

      • 如果为@saldo_a_depreciar 传入了一个值,那么就按原样使用该值
      • 如果为@saldo_a_depreciar 传入NULL - 然后将计算作为存储过程中的第一个命令进行

      所以我会写这样的代码:

      CREATE PROCEDURE [SISACT].[new_activo_fijo]
        @activo VARCHAR(8) ,
        @descripcion VARCHAR(60) ,
        @utiliza_serial BIT,
        @serial VARCHAR(20) = NULL,
        @fecha_adquisicion DATE,
        @referencia VARCHAR(10),
        @costo_adquisicion FLOAT,
        @vida_util INT,
        @saldo_a_depreciar FLOAT = NULL,
        @ultimo_periodo CHAR(6),
        @periodo_saldo_cero CHAR(6) = NULL,
        @fecha_incorporacion DATE,
        @fecha_desincorporacion DATE,
        @proveedor VARCHAR(8),
        @situacion INT
      AS
         IF @saldo_a_depreciar IS NULL
            SET @saldo_a_depreciar = @costo_adquisicion / @vida_util
      
         INSERT INTO [SISACT].[ACTIVOS_FIJOS] (
            activo, descripcion, utiliza_serial, serial, fecha_adquisicion, 
            referencia, costo_adquisicion, vida_util, saldo_a_depreciar,
            ultimo_periodo, periodo_saldo_cero, fecha_incorporacion,
            fecha_desincorporacion, proveedor, situacion)
        VALUES(
             @activo, @descripcion, @utiliza_serial, @serial, @fecha_adquisicion,
             @referencia, @costo_adquisicion, @vida_util, @saldo_a_depreciar, 
             @ultimo_periodo, @periodo_saldo_cero,  @fecha_incorporacion,
             @fecha_desincorporacion, @proveedor, @situacion)
      

      【讨论】:

        【解决方案3】:

        MS SQL Server 确实支持存储过程的默认值,但是您需要将 @saldo_a_depreciar 的计算移到“AS”之后的过程代码中。

        DECLARE @saldo_a_depreciar FLOAT;
        SET @saldo_a_depreciar = @costo_adquisicion / @vida_util;
        

        【讨论】:

          猜你喜欢
          • 2018-02-03
          • 2018-10-02
          • 2015-10-03
          • 1970-01-01
          • 2018-10-03
          • 2013-05-28
          • 2013-01-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多