用于计算过滤搜索记录的存储过程

时间:2011-07-06 14:05:09

标签: tsql sql-server-2008

我有一个存储过程来计算过滤搜索的记录(参见下面)

但是,如果我对字段'academiejaar'(学年)和'studierichting'(课程)进行过滤搜索,我得错了。

这是我的存储过程:

@voornaam nvarchar(50) = null,
@naam varchar(50) = null,
@studierichting varchar(50) = null,
@academiejaar varchar(9) = null,
@gastinstelling nvarchar(100) = null,
@periode varchar(50) = null,
@recordCount int = NULL OUTPUT

AS

IF (@recordCount IS NOT NULL)
BEGIN
SET @recordCount = (SELECT
COUNT(*) FROM Studenten
INNER JOIN  Curriculum 
ON Studenten.id=Curriculum.studentid 
INNER JOIN erasmus 
ON Studenten.id=erasmus.studentid 
WHERE
([studenten].voornaam LIKE '%' + @voornaam + '%' OR @voornaam IS NULL)
    AND ([studenten].naam LIKE '%' + @naam + '%' OR @naam IS NULL)
    AND ([erasmus].academiejaar = @academiejaar OR @academiejaar IS NULL)
    AND ([erasmus].gastinstelling LIKE '%' + @gastinstelling + '%' OR       @gastinstelling IS NULL) 
    AND ([erasmus].periode = @periode OR @periode IS NULL)
    AND ([curriculum].studierichting_vorig LIKE '%' + @studierichting + '%' OR @studierichting IS NULL))

RETURN
END

我从这个存储过程中获得的计数要高得多。我得到的记录数为39,而应该是8

有没有人在这个SQL查询中看到错误?

感谢您的帮助,

安东尼 比利时

3 个答案:

答案 0 :(得分:0)

为什么不选择给定相同参数的返回行,而不是返回记录计数。然后你可以看到你没有想到的返回哪些行 - 看到实际数据会给出一个更好的线索,说明为什么计数不同。在不知道您传递的参数,表中的数据以及返回的39行的情况下,没有人能够为您提供简单的答案。

答案 1 :(得分:0)

CREATE PROCEDURE GETData
(
    @voornaam nvarchar(50) = null,
    @naam varchar(50) = null,
    @studierichting varchar(50) = null,
    @academiejaar varchar(9) = null,
    @gastinstelling nvarchar(100) = null,
    @periode varchar(50) = null,
    @recordCount int = NULL OUTPUT
)
AS

IF (@recordCount IS NOT NULL)
BEGIN

        ;with CTE AS
        (
            SELECT Distinct Studenten.id as CountID         
            FROM Studenten 
            INNER JOIN  Curriculum  ON Studenten.id=Curriculum.studentid 
            INNER JOIN erasmus ON Studenten.id=erasmus.studentid 
            WHERE ([studenten].voornaam LIKE '%' + @voornaam + '%' OR @voornaam IS NULL)
            AND ([studenten].naam LIKE '%' + @naam + '%' OR @naam IS NULL)
            AND ([erasmus].academiejaar = @academiejaar OR @academiejaar IS NULL)
            AND ([erasmus].gastinstelling LIKE '%' + @gastinstelling + '%' OR @gastinstelling IS NULL) 
            AND ([erasmus].periode = @periode OR @periode IS NULL)
            AND ([curriculum].studierichting_vorig LIKE '%' + @studierichting + '%' OR @studierichting IS NULL)
        )
        SELECT @recordCoun=COUNT(CountID)
        From CTE 

RETURN
END

答案 2 :(得分:0)

'伟大的神秘'得到了解决。看来问题不在存储过程中,而是在我的webapplication代码中,我的下拉列表中的值没有超过我的代码中的count()函数:

private int CountDossiers()
        {
            var studentCriteria = new StudentCriteria
                               {
                                   Voornaam = txtSearchVoornaam.Text,
                                   Naam = txtSearchNaam.Text
                               };

            if (!string.IsNullOrEmpty(ddlSearchStudieRichting.SelectedValue))
            {
                studentCriteria.Studierichting = (Studierichting)Enum.Parse(typeof(Studierichting), ddlSearchStudieRichting.SelectedValue);
            }
            **if (!string.IsNullOrEmpty(ddlSearchAcademieJaar.SelectedValue))
            {
                studentCriteria.Academiejaar = ddlSearchAcademieJaar.SelectedValue;
            }**
            return StudentManager.SelectCountForGetList(studentCriteria);

        }

这就是为什么我在时间上得到了错误的记录,这是所有学年的记录,而不是在搜索领域输入的学年。

现在我觉得有点傻了。)

安东尼