首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2008 T-SQL 語言增強全覽:複合運算子、MERGE、TVP 與新日期類型

     編輯:關於SqlServer

核心增強清單

  1. ALTER DATABASE 相容性等級:取代 sp_dbcmptlevel。
  2. 複合指派運算子:+= -= *= /= %= &= ^= |=。
  3. CONVERT 函數擴充:新增樣式代碼支援新日期類型。
  4. 日期/時間新類型:DATE、TIME、DATETIME2、DATETIMEOFFSET。
  5. GROUPING SETS / ROLLUP / CUBE:單一查詢多維彙總。
  6. MERGE 陳述式:原子性 UPSERT。
  7. SQL 相依性報告:sys.sql_expression_dependencies。
  8. 表值參數 (TVP):強型別表參數傳遞。
  9. 資料列建構函數:VALUES (..), (..), (..) 多列插入/衍生表。

重點特性深度解析

1. ALTER DATABASE 相容性等級

ALTER DATABASE MyDB
SET COMPATIBILITY_LEVEL = 100;  -- 80=2000, 90=2005, 100=2008

取代已棄用的 sp_dbcmptlevel,支援動態切換,無需獨佔模式。

2. 複合指派運算子

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 慣用語,減少變數重複引用,程式碼更簡潔。

3. 日期/時間新類型對照表

類型範圍精度儲存位元組典型用途
DATE0001-01-01 ~ 9999-12-31天3生日、單據日期、分割鍵
TIME(n)00:00:00.0000000 ~ 23:59:59.9999999100ns (n=7)3~5每日排程、耗時統計
DATETIME2(n)0001-01-01 ~ 9999-12-31 + 時間100ns (n=7)6~8高精度審計、時間序列
DATETIMEOFFSET(n)含時區位移的 DATETIME2100ns8~10跨時區應用、全球化系統

DATETIME2(3) 相當於舊 DATETIME 但精度 1ms(舊 3.33ms)且省 1 位元組(7 vs 8 bytes)。

4. GROUPING SETS 範例

SELECT Region, Category, SUM(Sales) AS TotalSales
FROM SalesData
GROUP BY GROUPING SETS (
    (Region, Category),  -- 明細
    (Region),            -- 區域小計
    (Category),          -- 類別小計
    ()                   -- 總計
);

單次掃描完成多層級彙總,替代多次 UNION ALL。

5. MERGE 完整語法模板

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.*;  -- 記錄異動明細

6. TVP 宣告與使用

-- 資料庫端
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;

7. 資料列建構函數

-- 多列 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);

遷移建議

  • 新專案預設使用 DATETIME2(3) 替代 DATETIME,DATE/TIME 替代舊式轉換邏輯。
  • 所有 UPSERT 改寫為 MERGE,啟用 OUTPUT 子句記錄稽核軌跡。
  • 批量參數全面採用 TVP,淘汰 XML/Split/迴圈模式。
  • 相容性等級升級至 100 前,務必跑通完整迴歸測試(特別是 ORDER BY 無 TOP、舊式外部聯結 *= 等行為變更)。

總結

SQL Server 2008 T-SQL 增強聚焦於「開發效率」(複合運算子、資料列建構子、TVP)、「資料模型精度」(新日期類型)、「集合運算威力」(MERGE、GROUPING SETS)三大維度。掌握這些特性,可將資料庫層業務邏輯代碼量減少 30% 以上,並顯著提升執行效能與可維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved