2013-03-22 69 views
0

我有表包含以下列empid,month,year,day1,day2,day3,day4 ........... day31。T-SQL/MS SQL SERVER更新使用案例

我已經寫了一個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 

可以在這個任何人的幫助?

+1

「誰能幫忙嗎?」 - 我可以將它改爲更合理的設計,每天只有一排*行,但我認爲這不是您要求的那種幫助。 – 2013-03-22 07:35:45

回答

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。 (或者甚至empid, date,attendance。)這樣,你將每天有一行,而查詢表(不,不僅僅是這一個)變得更容易管理。

+0

但是,它會讓SP太長,這就是我思考的原因。 – user1532888 2013-03-22 07:14:23

+1

@ user1532888然後你應該改變你的表格模式,因爲我建議。它會讓生活更容易,比處理31個不同的列更容易。 – 2013-03-22 07:14:53

+0

@ user1532888: - IC。解決方案更好..你應該首先考慮你的表模式以獲得無縫解決方案。 – Pranav 2013-03-22 07:18:50