2013-06-18 2 views
0

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 
+0

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'. –

+0

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

Répondre

1

Que pensez-vous de cela?

... 
AND [Result] LIKE CASE @Result WHEN '' THEN '' ELSE @Result + '%' END) 
Questions connexes