我有一个存储过程来计算过滤搜索的记录(参见下面)
但是,如果我对字段'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查询中看到错误?
感谢您的帮助,
安东尼 比利时
答案 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);
}
这就是为什么我在时间上得到了错误的记录,这是所有学年的记录,而不是在搜索领域输入的学年。
现在我觉得有点傻了。)
安东尼