【问题标题】:False results being returned from stored procedure?存储过程返回错误结果?
【发布时间】:2017-10-24 01:18:34
【问题描述】:

我在 Microsoft SQL Server 中编写了一个存储过程,应该从 4Matrix 导入结果并将它们插入到 MyPortal 上的 Results 表中。它确实会导入结果,但是,其中一些结果是不正确的。

这是存储过程ImportResults的代码:

USE [MyPortal]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:      CURRICULUM\r.richards
-- Create date: 24/10/2017
-- Description: Imports Selected Subject Results From 4Matrix into MyPortal
-- =============================================
ALTER PROCEDURE [dbo].[ImportResults]
    @SubjectID int,
    @ResultSet varchar(50)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @StudentID int
    DECLARE @Upper int = (SELECT COUNT(*) FROM Students)
    DECLARE @ResultSetID int
    DECLARE @ResultValue NVARCHAR(50)
    DECLARE @Pointer int = 1

    WHILE @Pointer <= @Upper
    BEGIN
        SET @StudentID = (SELECT studentID 
                          FROM 
                              (SELECT
                                   ROW_NUMBER() OVER (ORDER BY Students.studentLastName) AS rownumber,
                                   studentID
                               FROM 
                                   Students) AS foo
                          WHERE rownumber = @Pointer)
        SET @ResultSetID = (SELECT rsID 
                            FROM ResultSets 
                            WHERE (rsName = @ResultSet))

        EXEC Get4MResult @StudentID, @SubjectID, @ResultSet, @Result = @ResultValue OUTPUT

        INSERT INTO Results(resultSet, resultStudent, resultSubject, resultValue)
        VALUES(@ResultSetID, @StudentID, @SubjectID, @ResultValue)

        SET @Pointer = @Pointer + 1
    END
END

“Get4MResult”过程的代码部分如下(如果是 this 过程导致问题):

USE [MyPortal]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:      CURRICULUM\r.richards
-- Create date: 24/10/2017
-- Description: Obtains Selected Result from 4Matrix Interface
-- =============================================
ALTER PROCEDURE [dbo].[Get4MResult]
    @StudentID int,
    @SubjectID int,
    @ResultSet varchar(50),
    @Result nvarchar(50) OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @KeyStage INT
    DECLARE @4MPupilID INT
    DECLARE @4MSubjectID INT
    DECLARE @4MSeriesID INT

    DECLARE @YearGroup VARCHAR(50) = (SELECT MyPortal.dbo.Students.studentYear 
                                      FROM MyPortal.dbo.Students 
                                      WHERE(Students.studentID = @StudentID))

    IF(@YearGroup = 'Year 10' OR @YearGroup = 'Year 11')
        SET @KeyStage = 4
    ELSE 
        SET @KeyStage = 3

    SET @4MPupilID = (SELECT FOUR.dbo.Pupils.PupilID 
                      FROM FOUR.dbo.Pupils 
                      WHERE MIS = @StudentID)

    IF(@KeyStage = 4)
        SET @4MSubjectID = (SELECT MyPortal.dbo.Subjects.subjectQsiKs4 
                            FROM MyPortal.dbo.Subjects 
                            WHERE (MyPortal.dbo.Subjects.subjectID = @SubjectID))
    ELSE 
        SET @4MSubjectID = (SELECT MyPortal.dbo.Subjects.subjectQsiKs3 
                            FROM MyPortal.dbo.Subjects  
                            WHERE (MyPortal.dbo.Subjects.subjectID = @SubjectID))

    SET @4MSeriesID = (SELECT FOUR.dbo.Series.SeriesID 
                       FROM FOUR.dbo.Series 
                       WHERE (SeriesName = @YearGroup+' - '+@ResultSet))

    SELECT @Result = Result 
    FROM FOUR.dbo.Results 
    WHERE (PupilID = @4MPupilID 
      AND SubjectID = @4MSubjectID 
      AND SeriesID = @4MSeriesID)
END

理论上,只有拥有 4M ID 的学生(来自学生表)应该有结果。只有 KS3 和 KS4 的学生有 4Matrix ID,所以当我运行它时,结果表中应该只有大约 400 个结果。

当我运行脚本ImportResults 1,'Spring 2017' 时,它确实导入如下结果:

但是,与我预期的约 400 个结果不同,有 1080 个结果条目。它们不是重复的,但是我发现有些学生的结果不存在,我不确定脚本哪里出错导致了这种情况。看这里:

这个学生 (4292) 在这门课上的成绩应该是“A*”。但是,经过进一步检查,我发现这个学生不在KS3或KS4,因此没有4Matrix ID。所以我不确定“A*”是从哪里来的。

根本不应该为该学生导入结果。

我已经浏览了这两个部分的代码,但看不到错误发生在哪里?

【问题讨论】:

  • 有什么可以帮助您的吗?
  • 哪些“一些”不正确?您使用了哪些样本数据来检查结果?结果应该是什么? IOW,更多细节可以提供更好的帮助。
  • @SezMe 为我的简短描述道歉。我现在已经详细说明了上面的问题。谢谢。
  • @Squirrel 我已经更新了问题描述

标签: sql-server stored-procedures datagrip


【解决方案1】:

我设法解决了这个问题:

问题似乎出在最初的 ImportResults 过程中,即使学生没有拥有 4Matrix ID,他们仍然会通过 ID 为0 或 NULL,返回 A* 值。

我将程序更正如下:

DECLARE @StudentID int
DECLARE @Upper int = (SELECT COUNT(*) FROM Students)
DECLARE @ResultSetID int
DECLARE @ResultValue NVARCHAR(50)
DECLARE @Pointer int = 1
DECLARE @4MatrixID int
WHILE @Pointer <= @Upper
  BEGIN
    SET @StudentID =(SELECT studentID FROM (
                                             SELECT
                                               ROW_NUMBER() OVER (ORDER BY 
Students.studentLastName) AS rownumber,
                                               studentID
                                             FROM Students
                                           ) AS foo
    WHERE rownumber = @Pointer)
    SET @4MatrixID = (SELECT student4mID FROM Students WHERE(studentID = 
@StudentID))


    IF(@4MatrixID IS NULL) <===== ###'ADDED THIS TO ELIMINATE STUDENTS WITHOUT IDs'###



      GOTO nextStudent <===== ###'SENDS TO THE END OF THE SCRIPT' [1]###




    SET @ResultSetID = (SELECT rsID FROM ResultSets WHERE(rsName = 
@ResultSet))
    EXEC Get4MResult @StudentID,@SubjectID,@ResultSet,@Result = @ResultValue 
OUTPUT
INSERT INTO Results(resultSet, resultStudent, resultSubject, resultValue)
  VALUES(@ResultSetID,@StudentID,@SubjectID,@ResultValue)




    nextStudent: <===[1]= ###'GETS PUSHED HERE AND THEREFORE BYPASSES THE RESULT RETRIEVAL'###
    SET @Pointer = @Pointer + 1
  END

这意味着必须使用可怕的 GOTO 语句,但它现在可以正常工作! :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2015-06-03
    • 2013-06-21
    • 2023-04-06
    • 2017-04-23
    • 1970-01-01
    相关资源
    最近更新 更多