CROSS APPLY 允許外部查詢每列呼叫表值函數,結果集為函數回傳列的交叉乘積。若函數回傳空集,該外部列不出現。OUTER APPLY 類似但保留外部列,函數對應欄位以 NULL 填補。
範例:fn_getsubtree 回傳部門經理下屬樹。SELECT * FROM Departments CROSS APPLY fn_getsubtree(deptmgrid) 會重複部門列;OUTER APPLY 則保留 Gardening 部門(經理為 NULL),對應欄位為 NULL。
函數 fn_getnorders(@custid, @n) 回傳客戶最新 N 筆訂單。SELECT O.* FROM Sales.Customer C CROSS APPLY fn_getnorders(C.CustomerID, 2) O 取每客戶最新兩筆訂單。
SQL 2005 移除 SQL 2000 限制,允許在相關子查詢內引用表值函數並傳遞外部查詢欄位為參數。範例:找出經理擁有至少三名員工的部門。
ANSI SQL 定義四種參考動作,SQL 2000 僅支援 NO ACTION、CASCADE。SQL 2005 新增 SET DEFAULT、SET NULL。可在外鍵宣告中結合 ON UPDATE/DELETE 使用。
SET DEFAULT:刪除/更新被參考列時,將參考表對應列設為預設值。
SET NULL:設為 NULL(前提允許 NULL)。
範例:Customers 表含虛擬客戶 DUMMY;Orders 表 customerid CHAR(5) NULL DEFAULT('DUMMY'),外鍵 ON DELETE SET NULL ON UPDATE SET DEFAULT。刪除 FRIDA → 其訂單 customerid 變 NULL;更新 BILLY 為 DOLLY → 其訂單 customerid 變 DUMMY。若刪除 DUMMY 再更新 GNDLF 會報錯(預設值 DUMMY 已不在被參考表)。可查 sys.foreign_keys 檢視外鍵定義動作。
OPENROWSET 新增 BULK 選項,可存取關聯格式檔案資料,配合 bcp.exe 格式化檔大幅提升資料載入效能。@@ERROR 檢查模式,支援巢狀、交易控制、錯誤資訊擷取(ERROR_NUMBER() 等函數)。