2017-10-24 3 views
0

Ich habe eine gespeicherte Prozedur in Microsoft SQL Server geschrieben, die sollte importieren Ergebnisse von 4Matrix und fügen Sie sie in die Results Tabelle auf MyPortal. Es importiert Ergebnisse, jedoch sind einige von ihnen falsch.Falsche Ergebnisse von der gespeicherten Prozedur zurückgegeben?

Hier ist der Code für die gespeicherte Prozedur 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 

Der Codeteil für das Verfahren 'Get4MResult' wie (bei es ist das Verfahren das Problem verursacht) folgt:

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+' - '[email protected])) 

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

In der Theorie sollten nur Schüler mit 4M IDs (aus der Students Table) Ergebnisse haben. Nur KS3- und KS4-Studenten haben 4Matrix-IDs, daher sollten nur etwa 400 Ergebnisse in die Ergebnistabelle eingegeben werden, wenn ich sie ausführe.

Als ich das Skript ImportResults 1,'Spring 2017', es tut Import Ergebnisse wie folgt:

Results have been imported as a result of running script

jedoch anstelle der ~ 400 Ergebnisse, die ich erwartet hatte, gibt es 1.080 Ergebniseinträge. Sie sind keine Duplikate, aber stattdessen habe ich festgestellt, dass einige Schüler Ergebnisse haben, die nicht existieren, und ich bin nicht sicher, wo das Skript schief gelaufen ist, um dies zu verursachen. Schau mal hier:

Error

Dieser Student (4292) angeblich ein 'A *' hat in diesem Thema. Aber bei weiterer Überprüfung stellte ich fest, dass dieser Student nicht in KS3 oder KS4 ist und daher keine 4Matrix-ID hat. Ich bin mir also nicht sicher, woher das "A *" kommt.

No 4M ID

Ein Ergebnis sollte nicht wurden überhaupt für diese Schüler importiert.

Ich habe den Code für beide Teile durchlaufen und kann nicht sehen, wo der Fehler auftritt?

+1

wie können wir Ihnen helfen? – Squirrel

+1

Welche "einige" sind falsch? Mit welchen Stichprobendaten haben Sie die Ergebnisse überprüft? Was sollten die Ergebnisse sein? IOW, mehr Details ermöglichen bessere Hilfe. – SezMe

+0

@SezMe Entschuldigung für meine kurze Beschreibung. Ich habe jetzt das oben genannte Problem ausgearbeitet. Vielen Dank. –

Antwort

0

ich es geschafft, das Problem zu lösen:

Das Problem in den ursprünglichen ImportResults Verfahren zu sein schien, wo auch wenn Studenten haben nicht eine 4Matrix ID haben, wurden sie noch mit einer ID durchlaufen wird, von entweder 0 oder NULL, die den A * -Wert zurückgegeben hat.

korrigierte ich das Verfahren wie folgt:

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 

Es bedeutete, dass die gefürchtete GOTO-Anweisung zu verwenden, aber es funktioniert, wie es sollte jetzt! :)

Verwandte Themen