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; 
Смежные вопросы