字元字串類型
| 類型 | 最大長度 | 儲存特性 | 適用場景 |
char(n) | 8,000 | 固定長度,不足右補空格 | 固定代碼 (身分證、國碼) |
varchar(n) | 8,000 | 變動長度,實際長度+2 bytes | 一般文字、可變欄位 |
text | 2 GB | LOB 儲存,已淘汰 | 舊版大型文本 (新版用 varchar(MAX)) |
Unicode 字元字串類型
| 類型 | 最大長度 | 儲存特性 | 前綴 |
nchar(n) | 4,000 | 固定長度,雙位元組 | N'字串' |
nvarchar(n) | 4,000 | 變動長度,雙位元組 | N'字串' |
ntext | 1 GB | LOB 儲存,已淘汰 | N'字串' |
常數寫法:VALUES (N'中文'),前綴 N 表示 Unicode。
日期時間類型
| 類型 | 儲存大小 | 精度 | 範圍 |
datetime | 8 bytes | 3.33 ms | 1753-01-01 ~ 9999-12-31 |
smalldatetime | 4 bytes | 1 分鐘 | 1900-01-01 ~ 2079-06-06 |
常數格式:SET @Date = '1983-02-21 10:10 AM' (建議使用 ISO 8601: 'YYYY-MM-DDTHH:MM:SS')。
數值類型
| 分類 | 類型 | 說明 |
| 整數 | bigint | 8 bytes, -2^63~2^63-1 |
int | 4 bytes, -2^31~2^31-1 (最常用) |
smallint | 2 bytes, -32,768~32,767 |
tinyint | 1 byte, 0~255 |
bit | 1 bit, 0/1/NULL |
| 近似數值 | float(n) | 雙精度,15 位有效數字,避免用 = 比較 |
real | 單精度,7 位有效數字 |
| 精確數值 | decimal(p,s) | p=精度(1~38), s=小數位,金融必用 |
numeric | decimal 同義字 |
特殊類型:sql_variant
- 可儲存除
text, ntext, image, timestamp, sql_variant 外的任何類型。
- 限制:索引鍵長度 < 900 bytes;不可為 IDENTITY/計算欄位;不支援 LIKE、全文索引、+ 串聯、部分彙總函數 (AVG, SUM 等)。
變數類型
區域變數
DECLARE @LastName NVARCHAR(50), @FirstName NVARCHAR(30);
- 以
@ 開頭,批次/預存程序/函數內有效。
- 賦值:
SET @Var = 值 或 SELECT @Var = 欄位 FROM 表。
全域變數 (系統函數)
| 變數 | 說明 |
@@IDENTITY | 目前工作階段、任何作用域最後產生的識別值 (含觸發器產生的) |
SCOPE_IDENTITY() | 目前工作階段、**目前作用域**最後產生的識別值 (推薦使用) |
IDENT_CURRENT('Table') | 指定資料表、任何工作階段/作用域最後產生的識別值 |
@@ERROR | 上一條陳述式錯誤碼 (0=成功) |
@@ROWCOUNT | 上一條陳述式影響的列數 |
表值變數 (Table Variable)
DECLARE @Tbl TABLE (
ID INT PRIMARY KEY,
Name NVARCHAR(50) NOT NULL,
CreatedDate DATETIME DEFAULT GETDATE()
);
優點
- 行為像區域變數,作用域明確,批次/SP 結束自動清除。
- 可用於 SELECT/INSERT/UPDATE/DELETE,像一般資料表。
- 減少預存程序重新編譯 (Recompile)。
- 交易僅在更新期間存在,降低鎖定/記錄資源需求。
限制
- 不可用於
SELECT ... INTO @Tbl。
- CHECK/DEFAULT/計算欄位不可呼叫使用者定義函數。
- 無統計資料,查詢最佳化器假設 1 列,大量資料效能可能較差 (建議 < 1000 列使用)。
- 不可建立非叢集索引 (SQL 2014+ 可透過 PRIMARY KEY/UNIQUE 隱含建立)。
臨時表 vs. 表值變數 選擇指南
| 情境 | 建議 |
| 資料量大、需索引、統計資料、跨 SP 共用 | 臨時表 (#TempTable) |
| 小量資料、僅目前 SP 使用、避免重編譯 | 表值變數 (@TblVar) |
| 需動態 DDL (ALTER TABLE 加欄位) | 臨時表 |