2017-10-24 23 views
0

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」次のように(場合、それは問題を引き起こすこのプロシージャの)である。

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 

理論上は、4MのIDを持つ学生(学生テーブルからの)のみが結果を持つはずです。 KS3とKS4の学生だけが4つのマトリックスIDを持っているので、実行すると約400の結果が結果テーブルに入力されます。

私はスクリプトImportResults 1,'Spring 2017'を実行すると、それはは、以下のようなインポート結果行います

Results have been imported as a result of running script

をしかし、代わりに私が期待していた〜400の結果を、1080件の結果のエントリがあります。それらは重複ではありませんが、代わりに一部の生徒には存在しない結果があることがわかりました。これを引き起こすスクリプトがどこに間違っているのかわかりません。ここを見て:

Error

この学生(4292)は、おそらくこの主題に 'A *' を有します。しかし、さらに調べると、この学生はKS3またはKS4にはいないことがわかりました。そのため、4Matrix IDはありません。だから私は 'A *'がどこから来たのか分からない。

No 4M ID

結果がないは、この学生のために、すべてのインポートされている必要があります。

私は両方の部分のコードを実行しましたが、エラーがどこで発生しているのかわかりません。

+1

私たちはどのようにお手伝いできますか? – Squirrel

+1

「いくらか」は間違っていますか?どのようなサンプルデータを使用して結果を確認しましたか?結果はどうあるべきですか? IOW、より多くの詳細はより良い助けを可能にする。 – SezMe

+0

@SezMeは私の簡単な説明のためにお詫び申し上げます。私は今、上記の問題について詳しく説明しました。ありがとう。 –

答えて

0

私は問題を解決するために管理:

問題は、学生がないをしなかった場合でも4Matrix ID、彼らはまだIDを通過されていたきた元ImportResults手順、にあるように見えましたA *値を戻していた0またはNULLのいずれかを返します。

次のように私は手順を修正:

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文を使用することを意味し、それが今必要として、それは働きます! :)

関連する問題