五大特殊類型一覽
| 類型 | 別名/標準名 | 存儲 | 核心語義 | 典型用途 |
timestamp | rowversion | 8 字節 | 全局單調遞增版本號,與時間無關 | 樂觀鎖、緩存驗證、數據同步檢查點 |
bit | - | 1 位 (存儲 1 字節) | 布爾值:0/1/NULL | 標誌位、啟用狀態、是/否調查 |
uniqueidentifier | - | 16 字節 | 全局唯一標識符 (GUID/UUID) | 分布式主鍵、合併複製、外部系統關聯 |
sql_variant | - | 值大小 + 元數據 | 單列存儲多種基礎類型 | EAV 模型、動態屬性、配置值存儲 |
table | - | 內存/TempDB 頁 | 臨時結果集、表值參數 | 批量傳遞、函數返回、變量表 |
關鍵特性速記
timestamp / rowversion
- 每次
INSERT/UPDATE/DELETE 修改行時自動賦值 @@DBTS 並遞增。
- 不可作主鍵/聚簇索引/外鍵(值會變)。
SELECT @@DBTS 獲取當前數據庫版本計數器。
- 2005+ 推薦用
rowversion 別名(ANSI 標準)。
bit
- 字面量無需引號:
WHERE Flag = 1。
- 聚合
SUM(bit_col) 可統計 TRUE 數量。
- 索引選擇性極低(僅 0/1),單列索引幾乎無效,需組合索引。
uniqueidentifier
- 生成函數:
NEWID() (隨機)、NEWSEQUENTIALID() (有序、僅默認約束)。
- 隨機 GUID 導致聚簇索引碎片嚴重,聚簇索引慎用,非聚簇索引配合
NEWSEQUENTIALID() 或應用層有序生成 (COMB GUID)。
- 字符串表示 36 字符,存儲/傳輸開銷大,必要時才用。
sql_variant
- 元數據函數:
SQL_VARIANT_PROPERTY(val, 'BaseType'/'Precision'/'Scale'/'MaxLength'/'Collation')。
- 不支持
text/ntext/image/timestamp/sql_variant 基礎類型。
- 比較規則:先按類型優先級排序,再按值排序(不同類型間比較結果可能違反直覺)。
table
- 變量聲明:
DECLARE @T TABLE (Id INT PRIMARY KEY, Name NVARCHAR(50));。
- 表值參數:
CREATE TYPE T AS TABLE(...); CREATE PROC P @T T READONLY;。
- 函數返回:
CREATE FUNCTION F() RETURNS @T TABLE ...。
- 限制:
READONLY、無統計信息、不支持 DDL/游標 (除 READ_ONLY)。
用戶定義類型 (UDT) 兩種形態
| 形態 | 實現 | 能力 | 適用場景 |
| T-SQL 別名類型 | sp_addtype / CREATE TYPE ... FROM base_type | 命名語義、默認值、綁定規則/默認/CHECK | 業務代碼規範(身份證、手機、產品編碼) |
| CLR UDT | .NET 結構體 + SqlUserDefinedTypeAttribute | 方法、運算符、序列化、索引支持、強類型 | 複雜值對象(幾何點、貨幣、物理量、標識符) |
選型口訣
版本控制用 rowversion,布爾標誌用 bit 存;
分布式鍵用 uniqueidentifier,動態屬性 sql_variant;
批量參數傳 table 類型,業務語義定 UDT 專。
特殊類型解決標準類型覆蓋不到的 5% 場景,但也帶來額外複雜性。**架構評審時,每個特殊類型列都要有「業務必要性 + 替代方案對比 + 客戶端映射驗證」三項簽署**,防止濫用成為技術債。