2011-07-06 103 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); 

     } 

這就是爲什麼我得到了錯誤記錄計數的時間,所有學年的記錄數,而不是在搜索領域輸入的學年。

現在我感覺有點傻:)

安東尼