Je transmets des paramètres à une procédure stockée à partir d'un formulaire Web asp.net. Cependant, pour une combinaison particulière de paramètres, un seul paramètre semble ignoré.Procédure MS SQL stockée renvoyant des résultats inattendus basés sur des paramètres vierges
Les paramètres Je passe qui sont à l'origine de la question sont les suivantes:
EXEC @return_value = [dbo].[spProgressCohorts]
@StuYear = N'10',
@DataCollection = N'March 2013 Teacher Assessments',
@SubjectName = N'English',
@TeachingGroup = N'Select All',
@Subgroup = N'Select All',
@KS2 = '',
@Result = ''
Quand je lance la procédure stockée avec ces paramètres les résultats reviennent comme si la variable @Result est ignorée.
Les résultats du retour de procédure stockée sont (les colonnes de ks2en et de résultats sont inclus pour référence):
surname forename ks2en result
El Hajj Zeinab D
Grzelak Marlena F+
Sage Nigel
Cependant, je reçois obtenir juste le record de Nigel Sage (comme prévu, ce qui est ce qui doit être retourné par la procédure stockée) lorsque lorsque je lance la requête suivante:
select surname, forename, ks2en, result
from student join subject on subject.upn=student.upn
where datacollection='March 2013 Teacher Assessments' and stuyear='10' and name='english' and result='' and ks2en=''
Ma procédure stockée est massive, donc je vais juste inclure le code spécifique aux paramètres ci-dessus:
ALTER PROCEDURE [dbo].[spProgressCohorts]
@StuYear varchar(2),
@DataCollection varchar(100),
@SubjectName varchar(100),
@TeachingGroup varchar(30),
@Subgroup varchar(10),
@Result varchar(4),
@KS2 varchar(4)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
--interfering with SELECT statements.
SET NOCOUNT ON;
SELECT Forename + ' ' + Surname
FROM student
JOIN subject
ON subject.upn = student.upn
WHERE
(@StuYear = [stuyear]
AND @TeachingGroup = 'Select All'
AND [DataCollection] = @DataCollection
AND [Name] = @SubjectName
AND @Subgroup='Select All'
AND @KS2 = CASE @subjectName WHEN 'English' THEN KS2en WHEN 'Mathematics' THEN KS2ma ELSE KS2av END
AND [Result] like @Result + '%')
OR
(@StuYear = [stuyear]
AND @TeachingGroup Not Like 'Select All'
AND [DataCollection] = @DataCollection
AND [Name] = @SubjectName
AND [TeachingGroup] = @TeachingGroup
AND @Subgroup='Select All'
AND @KS2 = CASE @subjectName WHEN 'English' THEN KS2en WHEN 'Mathematics' THEN KS2ma ELSE KS2av END
AND [Result] like @Result + '%')
ORDER BY surname, forename
Il fonctionne exactement comme prévu. Utilisez '=' dans la procédure stockée si vous voulez une correspondance exacte. 'Comme '%'' correspondra à toutes les valeurs 'NOT NULL'. –
Merci @MartinSmith. Le problème est que j'en ai besoin pour rechercher des valeurs comme le résultat parce que là où j'ai un pararmètre passé à partir du webform, ce sera une note entière, par exemple A, B, C etc. et les résultats dans ma colonne de résultats peuvent avoir des valeurs + ou - ex. A +, A, A-, B +, B, B- etc. Y a-t-il un moyen de modifier mon instruction where de manière à ce qu'elle traite le cas de '@result = ''' et de '@ ks2 = ''' séparément ? – Matt