【发布时间】: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