Sql server 2008 使用存储过程检索数据

Sql server 2008 使用存储过程检索数据,sql-server-2008,stored-procedures,Sql Server 2008,Stored Procedures,此存储过程应该: 将userid和Date作为输入参数 检查此Id是否属于教师或学生 如果用户是学生,它应该输出他一天的主题以及每个主题将要讨论的内容 如果用户是一名教师,它应该输出他一天的课程以及他将在每节课上教授的内容 我使用的表格有:周计划(Id、日期、课程、计划),科目(姓名、Id),学生(用户名、姓名、班级),教师(姓名、用户名),时间表(科目、日期、班级) 现在我编写了这个存储过程(它应该做上面写的事情),但它没有 如果我写错了,请你检查一下,给我一些想法好吗?如果我用另一种方式问问

此存储过程应该:

  • userid
    Date
    作为输入参数

  • 检查此
    Id
    是否属于教师或学生

  • 如果用户是学生,它应该输出他一天的主题以及每个主题将要讨论的内容

  • 如果用户是一名教师,它应该输出他一天的课程以及他将在每节课上教授的内容

  • 我使用的表格有:
    周计划(Id、日期、课程、计划)
    科目(姓名、Id)
    学生(用户名、姓名、班级)
    教师(姓名、用户名)
    时间表(科目、日期、班级)

  • 现在我编写了这个存储过程(它应该做上面写的事情),但它没有

    如果我写错了,请你检查一下,给我一些想法好吗?如果我用另一种方式问问题,请告诉我

       ALTER PROCEDURE dbo.GetDaySubjects
       (
           @UserId int,
           @DateToday DateTime 
       )
       AS
       IF EXISTS(SELECT        Std_UserID
          FROM            Student
          WHERE        (Std_UserID = @UserId))
    
                  BEGIN 
         SELECT        WeeklyPlan.Wkp_Body, WeeklyPlan.Wkp_Date, WeeklyPlan.Wkp_lesson
         FROM            Class INNER JOIN
                         Student ON Class.Cls_ID = Student.Std_Class INNER JOIN
                         TimeTable ON Class.Cls_ID = TimeTable.Ttb_Class INNER JOIN
                         Subject ON TimeTable.Ttb_Subject = Subject.sbj_ID INNER JOIN
                         WeeklyPlan ON Subject.sbj_Name = WeeklyPlan.Wkp_lesson
         WHERE        (WeeklyPlan.Wkp_Date = @DateToday)
           END
    
         ELSE IF EXISTS(SELECT        Tch_UserID
               FROM            Teacher
               WHERE        (Tch_UserID = @UserId))
    
               BEGIN
    
           SELECT        TimeTable.Ttb_Class, WeeklyPlan.Wkp_lesson, WeeklyPlan.Wkp_Body,              Teacher.Tch_ID
    
           FROM            Subject INNER JOIN
                         TimeTable ON Subject.sbj_ID = TimeTable.Ttb_Subject INNER JOIN
                         WeeklyPlan ON Subject.sbj_Name = WeeklyPlan.Wkp_lesson INNER JOIN
                         Teacher ON TimeTable.Ttb_Teacher = Teacher.Tch_ID
            WHERE        (WeeklyPlan.Wkp_Date = @DateToday)
               END
    

    非常感谢。

    我对您的数据库结构的理解以及您的需求。您在where语句中缺少指定具有此计划的用户

    WHERE        (WeeklyPlan.Wkp_Date = @DateToday) 
                 AND Student.Std_UserID=@UserId
    
    第二个:

    WHERE        (WeeklyPlan.Wkp_Date = @DateToday)
                 AND Teacher.Tch_UserID = @UserId
    

    但我同意你对问题的看法。所以我认为你可以考虑把这个过程分成两个部分。取
    学生
    的一个和取
    老师
    的一个。然后这两个
    都存在(…)
    已经过时了。

    当我看到一个进程应该做的所有事情的列表时。。。。。你听说过单一责任原则吗??任何一段代码都应该做一件事,而且只能做一件事——并且做得很好并且没有错误……好的,谢谢你的反馈,如果你有一个,你能告诉我一个更好的写标题的方法吗?顺便说一句,这个程序实际上只做一件事!但它只分为两部分,当然如果你知道另一种方式,如果你提到它,我会非常感激。。谢谢。好吧,考虑到返回值是完全不同的(值的数量和它们的数据类型),我认为这是两个完全不同的任务压缩在一个进程中。这对我来说没有意义。我只是想知道为什么调用者还不知道他是在和学生还是老师打交道——我会创建两个独立的、不同的存储过程——每个任务一个——然后让调用者为每个作业调用正确的过程。好的,我将拆分它们。非常感谢您的帮助:)我很抱歉,因为我的代码很愚蠢,我会努力学得更快。谢谢。好的,我会尝试修改它们并检查结果。非常感谢你的帮助:)@OnlyHope:没问题。。如果你认为答案是好的,记得投赞成票。它给我们所有人温暖模糊的感觉:P