2011-07-06 105 views
1

计数记录我为计数过滤的搜索记录的存储过程(见下面)从过滤的搜索

但是,如果我做了场“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的recordCount,而它应该是8

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

感谢您的帮助,

安东尼 比利时

回答

0

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

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 
+0

嗨约杰什,感谢您的帮助,我想你的代码,如果我在SQL Server Management Studio中执行存储过程,我得到记录的确切数目,8:使用[erasmusmanager] GO DECLARE \t @return_value INT, \t \t @recordCount INT EXEC \t @return_value = [DBO] [sprocStudentSearchList] 01。\t @studierichting = N'sociologie ' \t \t @academiejaar = N'2011-2012' , \t \t @recordCount = @recordCount OUTPUT SELECT \t @recordCount如N '@的RecordCount' SELECT \t' 返回值'= @return_value 但是,如果在我的web应用程序中,记录数仍然是39.有点让我疯了! Anthony – Toontje

+0

如果存储过程在SSMS中给出的确切结果比在应用程序中给出相同的结果。你能提供你的应用程序代码获取这个商店程序的结果吗? –

0

'大神秘'被解决了。似乎这个问题是不是位于存储过程,但我的web应用代码,其中从我的下拉列表值不是过去在我的代码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); 

     } 

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

现在我感觉有点傻:)

安东尼