【问题标题】:MS SQL Stored procedure returning unexpected results based on blank parametersMS SQL 存储过程返回基于空白参数的意外结果
【发布时间】:2013-06-18 09:16:23
【问题描述】:

我正在将参数从 asp.net 网络表单传递给存储过程。

但是,对于一个特定的参数组合,单个参数似乎被忽略了。

我传递的导致问题的参数如下:

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和result列以供参考):

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

但是,当我运行以下查询时,我只得到了 Nigel Sage 的记录(正如预期的那样,这是存储过程应该返回的):

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

【问题讨论】:

  • 它完全按预期工作。如果您想要完全匹配,请在存储过程中使用 =like '%' 将匹配所有 NOT NULL 值。
  • 感谢@MartinSmith。问题是我需要它来搜索结果之类的值,因为我有一个从网络表单传递的参数,它将是一个完整的等级,例如 A、B、C 等,并且我的结果列中的结果可以有 + 或 - 值例如 A+、A、A-、B+、B、B- 等。有没有办法可以编辑 where 语句,以便分别处理 @result=''@ks2 ='' 的情况?

标签: sql-server variables stored-procedures parameters


【解决方案1】:

这个怎么样?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2018-04-03
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多