2013-06-18 52 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)