FIND MISSING NUMBER
https://www.dbrnd.com/2015/06/query-to-find-missing-number-id-sql-server/
Query to Find Missing Number and ID in SQL Server
In this post, I will give you one full demo to find a missing number of identity column in SQL Server.
Before a few days ago, I was working on production report and found that some number is missing. This sequence and missing number are very important.
Immediately one requirement come to my desk is, please find a list of all missing number for investigation purpose.
Below is a full demo script to find the missing number in SQL Server.
First Create one sample table with data.
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 | 
/*Create one table to store Numbers*/ 
CREATE TABLE dbo.tbl_Numbers 
( 
 ID INTEGER 
) 
GO 
/*Insert some test records. You can also see I have missed many number which we are going to find by query*/ 
INSERT INTO dbo.tbl_Numbers  
VALUES(1),(2),(3),(4),(6),(7),(9),(10) 
,(11),(15),(16),(19),(22),(23),(24) 
,(28),(32),(33),(34),(35),(38),(40) 
,(41),(42),(43),(44),(45),(47),(49) 
,(50) 
GO | 
Below is step by step script to find this missing number.
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 
97 
98 
99 
100 
101 | 
/*Step 1: Create one temp table and store all distinct Numbers*/ 
SELECT DISTINCT ID INTO #DistinctID FROM dbo.tbl_Numbers 
GO 
/*Step 2: Find NextID which has something missing before it. 
Store into one TempTable*/ 
SELECT  
 (ROW_NUMBER()OVER (ORDER BY ID ASC)) AS TableCountID 
 ,b.ID  
 ,( 
  SELECT Top 1 ID 
  FROM #DistinctID a WITH (NOLOCK) 
  WHERE a.ID > b.ID 
 ) AS NextID 
INTO #NextID 
FROM #DistinctID AS b WITH (NOLOCK) 
WHERE  
( 
 SELECT Top 1 ID 
 FROM #DistinctID a WITH (NOLOCK) 
 WHERE a.ID > b.ID 
) <> b.ID+1 
ORDER BY b.ID 
/*Step 3: Create one temp table to store missing number details */ 
CREATE TABLE #MissingID 
( 
 TableCountID INTEGER 
 ,ID INTEGER 
 ,NextID INTEGER 
 ,MissingID INTEGER 
 ,TotalDiff INTEGER 
) 
GO 
/*Step 4: Now start to find missing id using WHILE Loop. */ 
DECLARE @CountID INTEGER 
DECLARE @InnerLoopCountID INTEGER 
SET @CountID = 1 
WHILE (@CountID > 0) 
BEGIN 
INSERT INTO #MissingID 
SELECT  
 TableCountID 
 ,ID  
 ,NextID 
 ,CASE WHEN TotalDiff = 1 THEN ID+TotalDiff END AS MissingID 
 ,TotalDiff   
FROM 
( 
SELECT  
 TableCountID 
 ,ID 
 ,NextID 
 ,(NextID-ID)-1 AS TotalDiff 
FROM #NextID 
) AS T WHERE TableCountID = @CountID 
IF ((SELECT (NextID-ID)-1 FROM #NextID WHERE TableCountID = @CountID)>1) 
BEGIN  
 SET @InnerLoopCountID = (SELECT (NextID-ID)-1 FROM #NextID WHERE TableCountID = @CountID) 
WHILE (@InnerLoopCountID > 0) 
BEGIN 
 INSERT INTO #MissingID 
 SELECT  
  TableCountID 
  ,ID  
  ,NextID 
  ,ID+@InnerLoopCountID AS MissingNumber 
  ,TotalDiff   
 FROM 
 ( 
 SELECT  
  TableCountID 
  ,ID 
  ,NextID 
  ,(NextID-ID)-1 AS TotalDiff 
 FROM #NextID 
 ) AS T WHERE TableCountID = @CountID   
 SET @InnerLoopCountID = @InnerLoopCountID - 1     
END    
END 
SET @CountID = @CountID+1 
IF @CountID = (SELECT COUNT(1)+1 FROM #NextID) 
BEGIN  
 RETURN 
END 
END 
GO 
/*Step 5: Now select missing data from #MissingID temp table.  
You can find full details on MissingID.*/ 
SELECT *FROM #MissingID WHERE MissingID IS NOT NULL ORDER BY MissingID  
GO | 

Comments
Post a Comment