我是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
答案 0 :(得分:2)
基于实验,这是我发现的:
你能做到这一点:@saldo_a_depreciar FLOAT = @costo_adquisicion / @vida_util
。答案:没有,SQL Server(我的情况是2012)说Incorrect syntax near '/'
。将它包装在括号中(绝望的最后手段:-)也没有帮助。
你能做到这一点:@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 :(得分: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;