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

SQL Server 2008 T-SQL 語言增強全解析:Row Constructor、FORCESEEK、GROUPING SETS、TVP、MERGE 等

     編輯:關於SqlServer

增強功能清單

  1. T-SQL Row Constructor (行建構器)
  2. FORCESEEK 表提示
  3. GROUPING SETS、ROLLUP、CUBE 及 GROUPING_ID()
  4. 相容性層級 ALTER DATABASE 語法
  5. 使用者定義表資料類型
  6. 表值參數 (TVP)
  7. MERGE 陳述式

1. T-SQL Row Constructor

單一 INSERT 陳述式插入多列資料。

CREATE TABLE #a (Column1 nvarchar(max), Column2 nvarchar(max));
INSERT INTO #a VALUES (('1','1'), ('2','2'));
SELECT * FROM #a;

2. FORCESEEK 提示

強制查詢優化器使用索引搜尋 (Index Seek) 作為唯一存取路徑。

SELECT * FROM t WITH (FORCESEEK) WHERE i IN (@p1,@p2,@p3,@p4,@p5);

3. GROUPING SETS

  • GROUP BY 新增 GROUPING SETS、ROLLUP、CUBE 運算子。
  • 新函數 GROUPING_ID() 回傳更多群組層級資訊。
  • WITH ROLLUP、WITH CUBE、ALL 等非 ISO 標準語法移除。

4. 相容性層級

ALTER DATABASE database_name SET COMPATIBILITY_LEVEL = {80|90|100} 取代 sp_dbcmptlevel。80=SQL 2000, 90=SQL 2005, 100=SQL 2008。

5. 使用者定義表類型

CREATE TYPE LocationTableType AS TABLE (LocationName VARCHAR(50), CostRate INT);

  • 可作為參數傳遞給陳述式、預存程序、函數。
  • 支援唯一約束與主鍵。
  • 限制:不可作為資料表欄位、不可建立非叢集索引 (除非來自 PK/UNIQUE)、不可指定 DEFAULT、建立後不可變更等。

6. 表值參數 (TVP)

參考使用者定義表類型,傳遞多行資料。範例:

CREATE PROCEDURE usp_InsertProductionLocation @TVP LocationTableType READONLY
AS INSERT INTO [Production].[Location] ([Name],[CostRate],[Availability],[ModifiedDate])
SELECT *, 0, GETDATE() FROM @TVP;

TVP 唯讀,不可作 OUTPUT 參數。

7. MERGE 陳述式

基於來源資料聯接結果,在目標表上執行 INSERT/UPDATE/DELETE。語法完整支援 OUTPUT 子句。

MERGE Production.ProductInventory AS Pi
USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail ... ) AS src
ON (pi.ProductID = src.ProductID)
WHEN MATCHED AND pi.Quantity - src.OrderQty <> 0 THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty
WHEN MATCHED AND pi.Quantity - src.OrderQty = 0 THEN DELETE;

典型銷售出貨扣庫存案例,單一陳述式完成更新與刪除。

結語

SQL Server 2008 T-SQL 增強提升查詢效率與開發生產力,配合 Visual Studio 2008 發布,助力企業級應用快速建置。

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