分区内插入存储过程T-SQL

时间:2013-03-12 21:14:07

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

我是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

3 个答案:

答案 0 :(得分:2)

基于实验,这是我发现的:

  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。

  3. 至于您的@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。

答案 1 :(得分:1)

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

我会做以下事情:

  • 如果传入@saldo_a_depreciar的值 - 那么只需按原样使用该值
  • 如果为NULL传入@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 [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)

答案 2 :(得分:1)

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

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