0

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

4

3 回答 3

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。

至于您的@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 传递。

于 2013-03-12T21:40:22.803 回答
1

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

我会做以下事情:

  • 如果传入了一个值@saldo_a_depreciar- 然后就按原样使用该值
  • ifNULL传入 for @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)
于 2013-03-12T21:39:53.217 回答
1

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

DECLARE @saldo_a_depreciar FLOAT;
SET @saldo_a_depreciar = @costo_adquisicion / @vida_util;
于 2013-03-12T21:40:44.617 回答