在 SQL Server 2005 及更早版本中,資料表變數無法作為預存程序參數傳遞。開發人員只能逐筆傳送資料列,或採用 XML、逗號分隔字串等替代方案。雖然 .NET 2.0 提供 SqlBulkCopy 可批量寫入資料表,但仍無法直接將多筆資料列一次性傳給預存程序。
SQL Server 2008 引入表值參數,允許以使用者定義資料表類型(UDTT)為基礎,將整組資料集作為單一參數傳遞給 T-SQL 陳述式或預存程序,極大簡化了批量資料處理的開發模式。
表值參數的基礎是使用者定義資料表類型。在 SSMS 的「可程式設計」→「類型」節點下,可看到「使用者定義資料表類型」資料夾。右鍵選擇「新增使用者定義資料表類型」會開啟範本查詢視窗。
點擊工具列「指定範本參數值」按鈕,填入結構描述名稱、類型名稱、資料行定義等資訊。確定後,範本會產生 CREATE TYPE 陳述式,可手動補充欄位、主鍵、約束等。
-- ================================
-- Create User-defined Table Type
-- ================================
USE Test;
GO
CREATE TYPE dbo.MyType AS TABLE
(
col1 int NOT NULL,
col2 varchar(20) NULL,
col3 datetime NULL,
PRIMARY KEY (col1)
);
GO
DROP TYPE 後重建。搭配 SQL Server 2008 新增的 MERGE 陳述式,表值參數可高效實現「Upsert」(存在則更新、不存在則插入)等資料倉庫常見邏輯,避免建立暫存表或多參數呼叫的複雜度。