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が2つの場合に計算されます。(1)パラメーターを渡さなかった場合と(2)パラメーターをnullとして渡した場合です。

于 2013-03-12T21:40:22.803 に答える
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)
于 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 に答える