【问题标题】:T-SQL/MS SQL SERVER UPDATE USING CASET-SQL/MS SQL SERVER 更新使用案例
【发布时间】:2013-03-22 16:08:03
【问题描述】:

我的表格包含以下列 empid、month、year、day1、day2、day3、day4............day31。

我写了一个SP来每天更新考勤,一旦员工登录。

CREATE PROC PROC_Attendance_update @empid INT, @day INT, @month INT, @year INT 

AS

BEGIN

DECLARE @sql_text VARCHAR(8000)

SET @sql_Text = 'UPDATE tblattendance SET DAY'+CONVERT(VARCHAR(2),@day)+'=''P'' WHERE empid = '+CONVERT(VARCHAR(4), @empid)+'  AND month = '+CONVERT(VARCHAR(4), @month)+' AND Year ='+CONVERT(VARCHAR(4), @year)

EXEC(@sql_text)

END

但是,我不希望它在动态 sql 中。我想将其重写为标准的 T-SQL 代码。

我试过没有用。

CREATE PROC PROC_Attendance_update @empid INT, @day INT, @month INT, @year INT 

AS

BEGIN

UPDATE tblattendance SET CASE   WHEN @day=1 THEN DAY1 = 'P'

                WHEN @day=2 THEN DAY2 = 'P'

                .

                .

                WHEN @day=31 THEN DAY31 = 'P'               

              END

WHERE empid = @empid AND MONTH = @month AND Year = @Year
END

有人可以帮忙吗?

【问题讨论】:

  • "有人可以帮忙吗?" - 我可以将其更改为更合理的设计,即每天有一个 ,但我认为这不是您要求的那种帮助。

标签: sql-server tsql


【解决方案1】:
IF @day = 1
    UPDATE tblattendance 
    SET DAY1 = 'P' 
    WHERE empid = @empid 
    AND MONTH = @month AND Year = @Year
ELSE IF @day = 2
    UPDATE tblattendance 
    SET DAY2 = 'P' 
    WHERE empid = @empid 
    AND MONTH = @month AND Year = @Year
ELSE IF @day = 3
    UPDATE tblattendance 
    SET DAY3 = 'P' 
    WHERE empid = @empid 
    AND MONTH = @month AND Year = @Year
--...

或者更好的是,将表架构更改为empidmonthyeardayattendance。 (甚至是empiddateattendance。)这样,您每天将有一行,并且对表的查询(不,不仅仅是这一行)变得更容易管理。

【讨论】:

  • 但是,这会让SP太长,这就是我在想的原因。
  • @user1532888 然后您应该按照我的建议更改表架构。与处理 31 个不同的列相比,它会让生活轻松得多
  • @user1532888:- IC。解决方案更好..您应该首先考虑您的表架构以获得无缝解决方案..
  • 如果你有机会改变你的数据库设计,现在就去做吧。
猜你喜欢
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 2013-06-12
  • 2011-02-22
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
相关资源
最近更新 更多