繁体   English   中英

Sql Server存储过程中的更新问题

[英]Update issue in Sql Server stored procedure

我在存储过程中有一个小问题,我有一个对2列进行更新的过程,这是我的过程:

CREATE PROCEDURE [dbo].[P_Attendance_CheckTime1]
@EMP_ID INT = null, /*Employee Source Code*/
@Trns_Typ nvarchar = null,/*Transaction Type('Check In','Check Out')*/
@Trns_TS Datetime = null,/*Transaction Time Stamp*/
@OUT_TS Datetime = null,/*Attendance Out Time Stamp*/
@IN_TS Datetime = null,/*Attendance In Time Stamp*/
@EMP_Srgt  INT = null, /*Employee Surrogate Key INsert it into Var.*/
@Dt_Srgt INT  = null /*Date Surrogate Key INsert it into Var.*/
AS
BEGIN
SET NOCOUNT ON;
if  @Trns_Typ in ('Check In', 'Check Out') 
    begin
    select Emp_Srgt = @EMP_Srgt 
        from [dbo].[D_EMPLOYEE] 
        where [EMP_SRC_CD] = @EMP_ID;
    select [DT_SRGT]= @Dt_Srgt 
        from d_date 
        where G_DT = replace(convert(varchar(12),@Trns_TS,112),'-','');
    select [ATND_EMP_OUT_TS] = @OUT_TS, [ATND_EMP_IN_TS] = @IN_TS 
        from [dbo].[F_ATTENDANCE]
    where [ATND_EMP_SRGT] = @EMP_Srgt and [ATND_DT_SRGT] = @Dt_Srgt;
end;
else if @Trns_Typ = 'Check In' and (@IN_TS is null or @IN_TS > @Trns_TS  ) 
    begin
    update [dbo].[F_ATTENDANCE] 
        set [ATND_EMP_IN_TS] = @Trns_TS
    ,[ATND_TIME]=convert(float,replace(left(convert(time,([ATND_EMP_OUT_TS] - @Trns_TS),103),5),':','.'))
    where [ATND_EMP_SRGT] = @EMP_Srgt and [ATND_DT_SRGT] = @Dt_Srgt;
    end;
else if @Trns_Typ = 'Check Out' and (@OUT_TS is null or @OUT_TS < @Trns_TS ) 
    begin
     update [dbo].[F_ATTENDANCE] 
         set [ATND_EMP_OUT_TS] = @Trns_TS
     ,[ATND_TIME] = convert(float,replace(left(convert(time,(@Trns_TS - [ATND_EMP_IN_TS]),103),5),':','.'))
     where [ATND_EMP_SRGT] = @EMP_Srgt and [ATND_DT_SRGT] = @Dt_Srgt;
end;
Print 'There Are Error In These Data'
end;

我在此过程中遇到的问题没有进行任何更新,从我的角度来看,我看不到结构中的任何问题,因此请在此过程中帮助我并提供正确的语法

我将程序修改为此结构

CREATE PROCEDURE [dbo].[P_Attendance_CheckTime2]
@EMP_ID INT = null, /*Employee Source Code*/
@Trns_Typ nvarchar = null,/*Transaction Type('Check In','Check Out')*/
@Trns_TS Datetime = null,/*Transaction Time Stamp*/
@OUT_TS Datetime = null,/*Attendance Out Time Stamp*/
@IN_TS Datetime = null,/*Attendance In Time Stamp*/
@EMP_Srgt  INT = null, /*Employee Surrogate Key INsert it into Var.*/
@Dt_Srgt INT  = null /*Date Surrogate Key INsert it into Var.*/
AS
BEGIN
SET NOCOUNT ON;
select Emp_Srgt = @EMP_Srgt from [dbo].[D_EMPLOYEE] where [EMP_SRC_CD] = @EMP_ID;
select [DT_SRGT]= @Dt_Srgt from d_date where G_DT = replace(convert(varchar(12),@Trns_TS,112),'-','');
select [ATND_EMP_OUT_TS] = @OUT_TS, [ATND_EMP_IN_TS] = @IN_TS from [dbo].[F_ATTENDANCE]
where [ATND_EMP_SRGT] = @EMP_Srgt and [ATND_DT_SRGT] = @Dt_Srgt;
if @Trns_Typ = 'Check In' and (@IN_TS is null or @IN_TS > @Trns_TS  ) 
    begin
update [dbo].[F_ATTENDANCE] set [ATND_EMP_IN_TS] = @Trns_TS
,[ATND_TIME]=convert(float,replace(left(convert(time,([ATND_EMP_OUT_TS] - @Trns_TS),103),5),':','.'))
where [ATND_EMP_SRGT] = @EMP_Srgt and [ATND_DT_SRGT] = @Dt_Srgt;
end;
if @Trns_Typ = 'Check Out' and (@OUT_TS is null or @OUT_TS < @Trns_TS ) 
    begin
update [dbo].[F_ATTENDANCE] set [ATND_EMP_OUT_TS] = @Trns_TS
,[ATND_TIME] = convert(float,replace(left(convert(time,(@Trns_TS - [ATND_EMP_IN_TS]),103),5),':','.'))
where [ATND_EMP_SRGT] = @EMP_Srgt and [ATND_DT_SRGT] = @Dt_Srgt;
end;
Print 'There Are Error In These Data'
end;

谢谢

在第一个if条件中可能没有更新语句,这可能就是您的SP不更新任何内容的原因。

另外,您可能希望将其他两个else if部分更改为just if但这是根据您的业务需求,因此我可能是错的。

编辑:如果要为变量分配值,则需要使变量在分配的左侧等于。

改变以下

if  @Trns_Typ in ('Check In', 'Check Out') 
begin
    select Emp_Srgt = @EMP_Srgt 
        from [dbo].[D_EMPLOYEE] 
        where [EMP_SRC_CD] = @EMP_ID;
    select [DT_SRGT]= @Dt_Srgt 
        from d_date 
        where G_DT = replace(convert(varchar(12),@Trns_TS,112),'-','');
    select [ATND_EMP_OUT_TS] = @OUT_TS, [ATND_EMP_IN_TS] = @IN_TS 
        from [dbo].[F_ATTENDANCE]
    where [ATND_EMP_SRGT] = @EMP_Srgt and [ATND_DT_SRGT] = @Dt_Srgt;
end;

到以下

if  @Trns_Typ in ('Check In', 'Check Out') 
begin
    select @Emp_Srgt = EMP_Srgt 
        from [dbo].[D_EMPLOYEE] 
        where [EMP_SRC_CD] = @EMP_ID;
    select @DT_SRGT = [Dt_Srgt]
        from d_date 
        where G_DT = replace(convert(varchar(12),@Trns_TS,112),'-','');
    select @OUT_TS = [ATND_EMP_OUT_TS], @IN_TS = [ATND_EMP_IN_TS]
        from [dbo].[F_ATTENDANCE]
    where [ATND_EMP_SRGT] = @EMP_Srgt and [ATND_DT_SRGT] = @Dt_Srgt;
end;

希望这可以帮助。

感谢Guyes的帮助

这就是工作和测试后的程序结构

CREATE PROCEDURE [dbo].[P_Attendance_CheckTime]
@EMP_ID INT = null, /*Employee Source Code*/
@Trns_Typ nvarchar(50) = null, /*Transaction Type('Check In','Check Out')*/
@Trns_TS Datetime = null, /*Transaction Time Stamp*/
@OUT_TS Datetime = null, /*Attendance Out Time Stamp*/
@IN_TS Datetime = null, /*Attendance In Time Stamp*/
@EMP_Srgt  INT = null, /*Employee Surrogate Key INsert it into Var.*/
@Dt_Srgt INT  = null /*Date Surrogate Key INsert it into Var.*/
AS
BEGIN
SET NOCOUNT ON;
if  @Trns_Typ in ('Check In','Check Out') 
begin
    select @Emp_Srgt = EMP_Srgt 
        from [dbo].[D_EMPLOYEE] 
        where [EMP_SRC_CD] = @EMP_ID;
    select @DT_SRGT = [Dt_Srgt]
        from d_date 
        where G_DT = replace(convert(varchar(12),@Trns_TS,112),'-','');
    select @OUT_TS = [ATND_EMP_OUT_TS], @IN_TS = [ATND_EMP_IN_TS]
        from [dbo].[F_ATTENDANCE]
    where [ATND_EMP_SRGT] = @EMP_Srgt and [ATND_DT_SRGT] = @Dt_Srgt;
end;
if (@Trns_Typ = 'Check In' and (@IN_TS is null or @IN_TS > @Trns_TS  )) 
--or (@Trns_Typ = 'Check Out' and (@OUT_TS is null or @OUT_TS < @Trns_TS ))
    begin
update [dbo].[F_ATTENDANCE] set [ATND_EMP_IN_TS] = @Trns_TS
,[ATND_TIME]=convert(float,replace(left(convert(time,([ATND_EMP_OUT_TS] - @Trns_TS),103),5),':','.'))
where [ATND_EMP_SRGT] = @EMP_Srgt and [ATND_DT_SRGT] = @Dt_Srgt;
end;
if @Trns_Typ = 'Check Out' and (@OUT_TS is null or @OUT_TS < @Trns_TS ) 
begin
update [dbo].[F_ATTENDANCE] set [ATND_EMP_OUT_TS] = @Trns_TS
,[ATND_TIME] = convert(float,replace(left(convert(time,(@Trns_TS - [ATND_EMP_IN_TS]),103),5),':','.'))
where [ATND_EMP_SRGT] = @EMP_Srgt and [ATND_DT_SRGT] = @Dt_Srgt;
end;
end;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM