sp_dbcmptlevel。+= -= *= /= %= &= ^= |=。DATE、TIME、DATETIME2、DATETIMEOFFSET。sys.sql_expression_dependencies。VALUES (..), (..), (..) 多列插入/衍生表。ALTER DATABASE MyDB
SET COMPATIBILITY_LEVEL = 100; -- 80=2000, 90=2005, 100=2008
取代已棄用的 sp_dbcmptlevel,支援動態切換,無需獨佔模式。
DECLARE @x INT = 27;
SET @x += 2; -- 29
SET @x *= 3; -- 87
SET @x %= 10; -- 7
-- 位元運算
DECLARE @flags INT = 5; -- 0101b
SET @flags |= 2; -- 0111b = 7
SET @flags ^= 4; -- 0011b = 3
符合 C/C#/Java 慣用語,減少變數重複引用,程式碼更簡潔。
| 類型 | 範圍 | 精度 | 儲存位元組 | 典型用途 |
|---|---|---|---|---|
| DATE | 0001-01-01 ~ 9999-12-31 | 天 | 3 | 生日、單據日期、分割鍵 |
| TIME(n) | 00:00:00.0000000 ~ 23:59:59.9999999 | 100ns (n=7) | 3~5 | 每日排程、耗時統計 |
| DATETIME2(n) | 0001-01-01 ~ 9999-12-31 + 時間 | 100ns (n=7) | 6~8 | 高精度審計、時間序列 |
| DATETIMEOFFSET(n) | 含時區位移的 DATETIME2 | 100ns | 8~10 | 跨時區應用、全球化系統 |
DATETIME2(3) 相當於舊 DATETIME 但精度 1ms(舊 3.33ms)且省 1 位元組(7 vs 8 bytes)。
SELECT Region, Category, SUM(Sales) AS TotalSales
FROM SalesData
GROUP BY GROUPING SETS (
(Region, Category), -- 明細
(Region), -- 區域小計
(Category), -- 類別小計
() -- 總計
);
單次掃描完成多層級彙總,替代多次 UNION ALL。
MERGE INTO TargetTable AS T
USING SourceTable AS S
ON T.KeyCol = S.KeyCol
WHEN MATCHED AND T.ValCol <> S.ValCol THEN
UPDATE SET T.ValCol = S.ValCol, T.ModifiedDate = SYSDATETIME()
WHEN NOT MATCHED BY TARGET THEN
INSERT (KeyCol, ValCol, CreatedDate) VALUES (S.KeyCol, S.ValCol, SYSDATETIME())
WHEN NOT MATCHED BY SOURCE AND T.IsActive = 1 THEN
UPDATE SET T.IsActive = 0, T.ModifiedDate = SYSDATETIME() -- 軟刪除
OUTPUT $action, inserted.*, deleted.*; -- 記錄異動明細
-- 資料庫端
CREATE TYPE dbo.OrderItemType AS TABLE
(
ProductID INT NOT NULL,
Qty INT NOT NULL CHECK (Qty > 0),
UnitPrice MONEY NOT NULL,
PRIMARY KEY (ProductID)
);
GO
CREATE PROCEDURE usp_CreateOrder
@CustomerID INT,
@Items dbo.OrderItemType READONLY
AS
BEGIN
DECLARE @OrderID INT;
INSERT INTO Orders (CustomerID, OrderDate) VALUES (@CustomerID, SYSDATETIME());
SET @OrderID = SCOPE_IDENTITY();
INSERT INTO OrderDetails (OrderID, ProductID, Qty, UnitPrice)
SELECT @OrderID, ProductID, Qty, UnitPrice FROM @Items;
RETURN @OrderID;
END
-- 用戶端 (C#)
var items = new DataTable();
items.Columns.Add("ProductID", typeof(int));
items.Columns.Add("Qty", typeof(int));
items.Columns.Add("UnitPrice", typeof(decimal));
// fill rows...
cmd.Parameters.AddWithValue("@Items", items).SqlDbType = SqlDbType.Structured;
-- 多列 INSERT
INSERT INTO Colors (Name, Hex) VALUES
('Red', '#FF0000'), ('Green', '#00FF00'), ('Blue', '#0000FF');
-- 衍生表 / CTE 來源
SELECT * FROM (VALUES (1, 'A'), (2, 'B'), (3, 'C')) AS V(Id, Code);
DATE/TIME 替代舊式轉換邏輯。MERGE,啟用 OUTPUT 子句記錄稽核軌跡。ORDER BY 無 TOP、舊式外部聯結 *= 等行為變更)。SQL Server 2008 T-SQL 增強聚焦於「開發效率」(複合運算子、資料列建構子、TVP)、「資料模型精度」(新日期類型)、「集合運算威力」(MERGE、GROUPING SETS)三大維度。掌握這些特性,可將資料庫層業務邏輯代碼量減少 30% 以上,並顯著提升執行效能與可維護性。