除了常用的數值、字串、日期時間,SQL Server 提供五種特殊類型解決特定領域問題。本文逐一剖析內部機制、適用場景與常見誤區。
@@DBTS),每修改一列自動更新CONVERT(DATETIME, ts);rowversion 為同義詞 (建議新開發使用)varbinary(8)6F9619FF-8B86-D011-B42D-00C04FC964FF)NEWID():隨機 GUID,索引碎片極高,不宜作叢集索引鍵NEWSEQUENTIALID():有序 GUID (重啟後重置),適合叢集索引,但可預測性較高text/ntext/image/timestamp/sql_variant 外所有類型SQL_VARIANT_PROPERTY 解析#temp) 減少重編譯DECLARE @t TABLE (ID INT PRIMARY KEY, Name NVARCHAR(50), CreateDate DATETIME DEFAULT GETDATE());
透過 CREATE TYPE 封裝規則:
CREATE TYPE ProductCode FROM CHAR(7) NOT NULL;
-- 搭配 RULE/CHECK 约束: '^[A-Z]{2}\d{5}$'
實現領域驅動設計的值物件持久化,強化型別安全。
| 需求 | 推薦類型 | 避坑提醒 |
|---|---|---|
| 樂觀鎖版本戳 | rowversion | 勿當時間用 |
| 真/假旗標 | bit | 單欄別建索引 |
| 分散式主鍵 | uniqueidentifier (NEWSEQUENTIALID) | 避免隨機 GUID 做 CI |
| 動態屬性袋 | sql_variant / JSON (SQL 2016+) | JSON 更靈活可索引 |
| SP 內部暫存 | table 變數 | 大資料改 #temp |