0

我是新來的T-SQL,我想知道是否有可能做這樣的事情司內插入存儲過程的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

回答

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。

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) 
1

MS SQL Server確實支持存儲過程的默認值,但您需要將@saldo_a_depreciar的計算移動到「AS」之後的過程代碼中。

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