2013-06-18 113 views
0

我從一個asp.net webform將參數傳遞給存儲過程。MS SQL存儲過程返回基於空白參數的意外結果

但是,對於一個特定的參數組合,單個參數似乎被忽略。

我傳遞的參數是導致該問題如下:

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 = '' 

當我運行這些參數的結果返回好像@Result變量被忽略的存儲過程。

結果的存儲過程返回的(在ks2en和結果列都包含供參考):

surname  forename ks2en result 
El Hajj  Zeinab    D 
Grzelak  Marlena    F+ 
Sage  Nigel  

但是,我得到的只是得到奈傑爾賢者記錄(如預期,這是應該由被退回存儲過程)時,當我運行以下查詢:

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='' 

我的存儲過程是巨大的,所以我就包括具體到上面的參數代碼:

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

它完全按照預期工作。如果您想要完全匹配,請在存儲過程中使用'='。像'%''將匹配所有的'NOT NULL'值。 –

+0

感謝@MartinSmith。問題是我需要它來搜索像結果這樣的值,因爲如果我有一個從webform傳遞的參數,它將是一個完整的等級,例如A,B,C等,結果列中的結果可以具有+或 - 值例如A +,A,A-,B +,B,B-等等。有沒有辦法編輯我的where語句,以便分別處理'@result ='''和'@ ks2 ='''的情況? – Matt

回答

1

這個怎麼樣?

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