2017-04-03 57 views
0

我正在研究我的最后一年项目,这是一个学校管理系统,这个项目中有很多任务,但我此时正在考勤模块上工作,我创建了一个在SQL Server存储过程中面临重复错误

  1. 学生姓名
  2. 类名称
  3. 考勤状态(列名是 “状态”)
  4. 日期(当前考勤日期)
:其中包含四列SQL Server表

然后我创建了一个存储过程。该存储过程将获取学生姓名,班级名称和出勤状态作为参数,然后将其添加到考勤表中,该表格显示学生是否在指定日期或缺席, 日期列的默认值为getDate()

存储过程首先检查学生出勤是否已在表中存在当前日期,然后它会更改出勤状态列值而不是添加新行,并且如果学生出勤不存在当前日期,则存储过程将添加新行,

......

我的程序工作不正常,当我第一次传递参数,它增加了新行,当我再次通过相同的参数,那么它应该替换考勤状态列,但它又添加了一个新行。

但是,第三次,当我传递相同的参数,那么它工作正常,并取代状态列值,所以在这种情况下,我有同一个学生2行,但我只需要一行。

请指导我什么是我的存储过程中的问题 - 这里是代码:

create procedure spAttend_Stu 
    @Name nvarchar(200), 
    @C_Name nvarchar(50), 
    @Status nvarchar(50) 
as 
begin 
    if ((select count(*) 
     from tbl_Attend_Stu 
     where Student_Name = @Name 
      and Date = (select convert(date, getdate()))) > 1) 
     update tbl_Attend_Stu 
     set [Status] = @Status 
     where [Date] = (select convert(date, getdate())) 
    else 
     insert into tbl_Attend_Stu (Student_Name, Class_Name, Status) 
     values (@Name, @C_Name, @Status) 
end 

编辑:

这里是我的表definition..see这个截图:

Table structure

我把这个值作为例子

spAttend_Stu 'Ammar', 'BSCS', 'Absent' 

我再次运行相同的查询,但并不如预期的结果

鉴于此截图例如执行

example execution

回答

1

如果您发布的架构构造函数的语法这将是有益的为您的tbl_Attend_Stu,所以我们可以看到字段Date及其默认值。但是,有一个为你检查几个初步想法(注:没有看到的被传递什么样的例子,是在你的表什么样的价值观,很难确切知道):

  1. 也许@Name的价值并不是您期望它进入SP时的预期值。如果该值甚至稍有变化,那么第一个IF语句逻辑将不会找到该学生,并且会发生另一个插入。一个可能的解决方案可能是确保@Name@C_Name变量正确修剪;如果他们被带入空间的SP,那么它可能是你的罪魁祸首。
  2. 如果Date的默认值配置设置不正确,则在调用INSERT语句时不会插入日期。尝试明确地将INSERT声明中的Date设置为CONVERT(DATE, GETDATE()),然后查看是否给出您期望的结果。
  3. 我发现代码中有斑点的其他问题。例如,您错过了UPDATE语句逻辑中的第二个条件,仅更新特定学生的行。您现在拥有的方式将更新表格中每一行的Date字段。

我这里改写了你的逻辑,使其多一点可读性,并解决我上面提到的错误,以及其他小的语法错别字:

create procedure spAttend_Stu 
@Name nvarchar(200), 
@C_Name nvarchar(50), 
@Status nvarchar(50) 
AS 
BEGIN 

IF 
( 
    (SELECT COUNT(*) 
    FROM tbl_Attend_Stu 
    WHERE Student_Name = @Name 
     AND [Date] = CONVERT(DATE, GETDATE()) 
    ) 
    >= 1 
) 
    UPDATE tbl_Attend_Stu 
    SET [Status] = @Status 
    WHERE Student_Name = @Name 
     AND [Date] = CONVERT(DATE, GETDATE()) 

ELSE 

    INSERT INTO tbl_Attend_Stu 
     (Student_Name, Class_Name, Status) 
    VALUES 
     (RTRIM(LTRIM(@Name)), RTRIM(LTRIM(@C_Name)), @Status) 

END 
+0

非常感谢你的兄弟:)我已经试过你建议,但问题仍然存在,我已编辑我的问题,并添加了表格定义屏幕截图和我在这个时候使用的示例..请看看:) –

+0

您还可以提供您的表后运行后的样子使用您提供的示例值运行3次存储过程? – sadmicrowave

+0

好的兄弟我已经添加了一个截图,执行后请检查 –