在這篇文章中,我想跟各位分享一個相當有趣又實用的 SQL 查詢範例。這支查詢主要用來檢查資料庫中各個資料表的 Identity 欄位(通常作為主鍵使用)的目前值(last_value),並根據該欄位的資料型態來推算其可能達到的最大極限值。


查詢範例

以下就是完整的 SQL 查詢程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT OBJECT_NAME(ic.object_id) AS TableName,
ic.name AS IdentityColumn,
ic.last_value AS CurrentValue,
CASE
WHEN ty.name = 'tinyint' THEN 255
WHEN ty.name = 'smallint' THEN 32767
WHEN ty.name = 'int' THEN 2147483647
WHEN ty.name = 'bigint' THEN 9223372036854775807
ELSE N'非數值型態'
END AS MaxPossibleValue
FROM sys.identity_columns ic
JOIN sys.columns c
ON ic.object_id = c.object_id AND ic.column_id = c.column_id
JOIN sys.types ty
ON c.user_type_id = ty.user_type_id
WHERE ic.last_value > 50;

分步解析

1. 取得關鍵資訊

  • TableName:利用 OBJECT_NAME(ic.object_id) 將物件 ID 轉換成易讀的資料表名稱。
  • IdentityColumn:藉由 ic.name 直接取得 Identity 欄位的名稱,讓你一眼就知道是哪個欄位在運作。
  • CurrentValueic.last_value 代表目前該 Identity 欄位最後使用的數值,也就是下次插入資料時所會用到的數字。

2. 計算型態的極限值

這裡我們運用 CASE 語句,根據不同的數值型態,給出各自的最大可能值:

  • tinyint:最大值為 255。
  • smallint:最大值為 32767。
  • int:最大值為 2147483647。
  • bigint:最大值為 9223372036854775807。
  • 若欄位型態非上述數值型態,則回傳「非數值型態」。

這個邏輯能夠快速算出每個 Identity 欄位還有多少數值空間,幫助我們在系統接近極限前做好預防措施。

3. 連結系統檢視表

  • sys.identity_columns:此系統檢視表保存了所有具有 Identity 屬性的欄位資訊。
  • sys.columnssys.types:分別提供欄位的詳細資料與型態資訊,讓我們能根據資料型態正確計算出極限值。

4. 篩選條件

  • WHERE ic.last_value > 50:這個篩選條件只針對目前數值大於 50 的 Identity 欄位進行查詢,數值可以依照實際情況調整,讓你只聚焦在可能接近極限的那些資料表上。

實際應用場景

在大型應用系統中,許多專案會採用 Identity 欄位來作為主要的主鍵生成機制。隨著資料量不斷累加,Identity 欄位的數值也會逐漸逼近其資料型態所能表示的極限值。當這個狀況發生時,若沒有提前預防,就可能造成數值溢出。此時,你可以利用這支查詢快速掌握哪些資料表已經快到臨界點,並採取必要的措施(例如改變欄位型態或重設序列),確保系統的穩定與安全。


總結

這支查詢範例不僅展示了如何運用 MSSQL 的系統檢視表來取得 Identity 欄位的現況,還結合了資料型態的知識來推算每個欄位的最大極限值。對資料庫管理員和開發團隊來說,這都是一個極具參考價值的工具,可以在系統運行過程中及早預防潛在問題。希望透過這篇文章,大家能在日常的資料庫管理中多一份安心!