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

SQL Server 表值型別 vs 表變數:批量傳參與暫存資料的正確選擇

     編輯:關於SqlServer

核心差異速查

特性表值型別 (TVT)表變數 (@table)
定義位置資料庫層級 (CREATE TYPE)批次/SP 內部 (DECLARE)
可重用性✅ 多 SP/批次共用❌ 僅當前作用域
參數傳遞✅ SP 輸入參數 (READONLY)❌ 不可作參數
索引支援✅ 可定義 PK/UNIQUE/非叢集⚠ 僅隱含 PK/UNIQUE
統計資訊✅ 永久統計❌ 無統計 (估計 1 行)
並行計畫✅ 支援❌ 串行
版本需求SQL Server 2008+SQL Server 2000+
生命週期物件永久存在批次結束自動銷毀

表值型別 (TVT) — 批量參數首選

-- 1. 建立型別 (資料庫層級,一次建立永久使用)
CREATE TYPE dbo.SubCardTable AS TABLE (
    SC_ID VARCHAR(50),
    ZhuKaInfo_ID VARCHAR(50),
    Project_KeyName VARCHAR(50),
    SC_CardNumber VARCHAR(50),
    Statues INT DEFAULT 0,
    SC_AddTime DATETIME,
    SC_AddPerson VARCHAR(50),
    SC_Money INT,
    MainCardReceiveIntegral INT DEFAULT 0,
    SC_RelationCustom VARCHAR(50),
    SC_UseTime DATETIME,
    PRIMARY KEY (SC_ID)  -- 可定義索引
);
GO

-- 2. SP 使用
CREATE PROC usp_BatchInsertSubCard @Data dbo.SubCardTable READONLY
AS
    INSERT INTO SubCard (SC_ID, ZhuKaInfo_ID, ...)
    SELECT SC_ID, ZhuKaInfo_ID, ... FROM @Data;
GO

-- 3. C# 調用
var dt = new DataTable(); dt.Columns.Add(...); dt.Rows.Add(...);
var cmd = new SqlCommand("usp_BatchInsertSubCard", conn) { CommandType = CommandType.StoredProcedure };
var p = cmd.Parameters.AddWithValue("@Data", dt);
p.SqlDbType = SqlDbType.Structured;
p.TypeName = "dbo.SubCardTable";
cmd.ExecuteNonQuery();

表變數 — 輕量暫存、小資料、舊版相容

DECLARE @mtTable TABLE (
    Id INT PRIMARY KEY,  -- 隱含叢集索引
    Name VARCHAR(10)
);

INSERT INTO @mtTable VALUES (1, 'A'), (2, 'B');
SELECT * FROM @mtTable WHERE Id = 1;

適用:< 1 萬行、無需統計資訊、臨時中繼結果、SQL 2000/2005 相容。

效能實測提示

  • TVT + 索引 + 統計 → 大批量 (10 萬+) 穩定走索引查找/合併
  • 表變數無統計 → 優化器假設 1 行 → 易選錯計畫 (Nested Loops 代替 Hash Match)
  • 大資料量暫存首選 #temp table (有統計、可建索引、支援並行)

選型決策樹

需要跨 SP/批次共用結構? → 是 → TVT
需要作 SP 參數批量傳入?   → 是 → TVT
資料量 > 1 萬且需最優計畫? → 是 → #temp table 或 TVT(帶索引)
單批次內臨時小資料?        → 是 → 表變數
SQL Server 2005 或更舊?      → 是 → 表變數 或 #temp table
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved