文字與影像資料類型存取
- `text` / `ntext` / `image` 可直接用於 `SELECT` 選取清單
- 單次擷取大小受 `TEXTSIZE` 控制,預設 4096 位元組
- 修改:`SET TEXTSIZE 2147483647`(最大 2GB);目前值存於 `@@TEXTSIZE`
TEXTPTR + READTEXT 精確讀取
-- 取得文字指標(16 位元組二進位)
DECLARE @ptr VARBINARY(16)
SELECT @ptr = TEXTPTR(notes) FROM authors WHERE au_id = '172-32-1176'
-- 讀取指定位移、長度
READTEXT authors.notes @ptr 0 1000 -- 從位移 0 讀 1000 位元組
適用於大型物件分塊讀取、避免一次傳輸過大資料。
資料操作語言 (DML) 基礎
INSERT
-- 明確欄位
INSERT INTO table (col1, col2) VALUES (val1, val2)
-- 從 SELECT 插入
INSERT INTO table (col1, col2)
SELECT colA, colB FROM other_table WHERE ...
-- 從預存程序插入
INSERT INTO table (col1, col2)
EXEC sp_GetData
- 未列入欄位清單 → 依資料表定義順序
- `timestamp` / `IDENTITY` 欄位不可指定值(系統自動產生)
- 有 `DEFAULT` 限制的欄位可省略,將使用預設值
UPDATE
UPDATE table
SET col1 = val1, col2 = val2
WHERE search_condition
- 無 `WHERE` → 更新所有列(極度危險)
- 支援 `JOIN` 寫法:
`UPDATE t SET t.col = s.col FROM target t JOIN source s ON t.id = s.id`
DELETE
DELETE [FROM] table
WHERE search_condition
- 無 `WHERE` → 刪除所有列
- 支援 `JOIN` 刪除多表關聯資料
- 大量刪除考慮 `TRUNCATE TABLE`(無記錄、不可回復、重設 IDENTITY)
實務提醒
- 所有 DML 皆在交易內執行,隱含或顯式 `BEGIN TRAN`
- 大量操作分批次執行,避免鎖定升級與記錄檔暴增
- 搭配 `@@ROWCOUNT` 確認影響列數