2014-11-24 65 views
0

在我的SQL Server數據庫中,我有記錄是遞增的,有時我在ID增量中有一些空白。檢查Sql中是否存在一條記錄C#

ID  Data  Data 

9857370 Data (null) 
9857371 (null) (null) 
9857375 (null) (null) 
9857376 (null) (null) 

我們可以看到ID增量的差距。

編輯:

我使用C#與SQL爲一個ASP.net項目。 對於SQL請求,我選擇數據庫中的Last ID和OleDbDataReader中的C#我檢查每條記錄,如果他沒有(null)(null),就像我的示例中那樣,我遞減我的ID直到在列中有一個Data 。

但是當他在2條記錄之間跳轉時我無法檢查我的記錄。

ID  Data  Data 

9857371 (null) (null) 
9857375 (null) (null) 
+0

'選擇從yourtable COUNT(*),其中id = $ id',基本上看計數返回爲。 0 =沒有匹配的行。 – 2014-11-24 17:05:30

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2014-11-24 17:05:49

+0

什麼問題?看看第一條評論。這非常簡單。或者你正在提出worng問題。如果是,請編輯它。 – JotaBe 2014-11-24 17:08:48

回答

0

好吧,我有我的解決問題!

我的問題是訪問數據庫中的數據,但記錄沒有數據(例如在9857371和9857375之間)或記錄爲空(9857376(null)(null))。

ID  Data  Data 

9857370 Data (null) 
9857371 (null) (null) 
9857375 (null) (null) 
9857376 (null) (null) 

這裏是我的代碼來訪問數據與循環,希望它會幫助別人

public void main(string url) 
{ 
    int var = 0; 
    string conn = url; 


    OleDbConnection connexion = new OleDbConnection(conn); 
    connexion.Open(); 

    OleDbCommand cmd = new OleDbCommand("SELECT ID, DATA1, DATA2 from Database WHERE ID = (SELECT MAX (ID) -" + var + " FROM Database);", connexion); 
    OleDbDataReader reader = cmd.ExecuteReader(); 
    reader.Read(); 



    if (connexion.State == ConnectionState.Open) 
    { 


     if (!reader.HasRows || (String.IsNullOrEmpty(reader[1].ToString())) && (String.IsNullOrEmpty(reader[2].ToString()))) 
     { 

      reader.Close(); 

      OleDbDataReader reader2 = cmd.ExecuteReader(); 
      reader2.Read(); 

     Found: 
      while (!reader2.HasRows || ((String.IsNullOrEmpty(reader2[1].ToString())) && (String.IsNullOrEmpty(reader2[2].ToString())))) 
      { 


       var++; 

       reader2 = fonction(var, url); 
       reader2.Read(); 
       if (!reader2.HasRows) 
       { 
        goto Found; 
       } 
       else if (((!String.IsNullOrEmpty(reader2[1].ToString())) || (!String.IsNullOrEmpty(reader2[2].ToString())))) 
       { 

        data = reader2[1].ToString() + " " + reader2[2].ToString(); 

       } 
       else 
       { 
        data = "No Data in Database"; 
       } 

      } 

      reader2.Close(); 
     } 
     else 
     { 

      data = reader[1].ToString() + " " + reader[2].ToString(); 
     } 

    } 
    else 
    { 
     data = "Connexion KO"; 
    } 



    reader.Close(); 
    connexion.Close(); 

} 
0

試試這個。使用Recursive CTE在表中的最大和最小ID之間生成ID。然後使用表格CTE與LEFT join以獲取缺失的行。

DECLARE @MaxID INT = (SELECT MAX(ID) FROM Tablename) 
DECLARE @MinID INT = (SELECT Min(ID) FROM Tablename) 

;WITH CTE 
AS (
    SELECT @MinID fullid 
    UNION ALL 
    SELECT fullid + 1 FROM CTE WHERE fullid < @MaxID 
    ) 
SELECT fullid as MissingId FROM CTE 
LEFT JOIN dbo.Tablename t on t.ID = CTE.fullid 
WHERE t.ID isNULL 
GO 
+0

從性能角度來看,使用rCTE進行計數確實很差。它的工作原理,但它仍然在逐行邏輯。 http://www.sqlservercentral.com/articles/T-SQL/74118/ – 2014-11-24 17:25:16

0

我通常具有Numbers表格準備好,其中只包括一個塔和所有從1到n的數字(n可以被容易地加倍需要時)。然後使用簡單的查詢來查找第一個未使用的數字。如:

SELECT TOP 1 NUMBER FROM NUMBERS 
WHERE NOT EXISTS (SELECT * FROM TABLE1 WHERE ID = N) 
ORDER BY NUMBER 

簡單而且速度很快,假設列數和索引都是索引的。

編輯:如何創建和填充數字表。

CREATE TABLE NUMBERS(NUMBER INT) 
GO 
INSERT INTO NUMBERS VALUES(1) 

,每當你需要仔細數數,請執行下列(1,2,4,8,...)

INSERT INTO NUMBERS 
SELECT (SELECT MAX(NUMBER) FROM NUMBERS) + NUMBER FROM NUMBERS