資料表值參數 Table Value Parameters 預存程序 批次更新資料

資料表值參數(Table Value Parameters)簡介與實作

蔡雅勤 2016/12/23 15:37:28
6810







主題

資料表值參數(Table Value Parameters)簡介與實作

文章簡介

透過簡單的範例,利用資料表值參數,來大批匯入資料至資料庫

作者

蔡雅勤

版本/產出日期

V1.0/2016.12.21




1. 前言

偶爾會遇到大批匯入新增或更新的功能,當資料量大的時候,使用傳統的方式一筆筆新增,很耗費效能,且會對SQL Server造成一定程度的效能影響。這時就可利用資料表值當作參數紀錄要異動的資料,傳給SQL的預存程序做一次性的執行,可大大提高執行效能





2. 目的

了解如何利用資料表值參數(Table Value Parameters) 進行大批匯入資料至資料表





3. 開始前準備

本範例建立於以下版本的環境:

Visual Studio 2013

Microsoft SQL Server 2014





4. TVP概述

4.1 資料表值參數(Table Value Parameters) 簡稱TVPSQL Server 2008中導入的新功能,讓使用者透過單一參數化SQL語法,就能向SQL Server傳送大量資料。



4.2 資料表值參數提供更大的彈性,而且在某些情況下,其效能優於暫存資料表或是傳遞參數清單的其他方法。資料表值參數提供下列好處:

不需要從用戶端鎖定初始擴展的資料。

提供簡單的程式設計模型。

可讓將複雜的商務邏輯併入單一常式內。

減少與伺服器之間的往返次數。

可以有一個不同基數的資料表結構。

具有強型別

可讓用戶端指定排序次序和唯一索引鍵。



4.3 資料表值參數有下列限制:

SQL Server 不會維護資料表值參數之資料行上的統計資料。

資料表值參數必須當做輸入 READONLY 參數傳遞給 Transact-SQL 常式。

不能使用資料表值參數當做 SELECT INTO INSERT EXEC 陳述式的目標





5. 範例實作

5.1 建立TVP TYPE,作為SP參數


CREATE TYPE [dbo].[TVP_MVCSG01] AS TABLE(

    [EMPID] [int] NOT NULL,

    [EMPNAME] [varchar](50) NOT NULL,

    [MARKS] [varchar](10) NOT NULL,

    [GRADE] [varchar](10) NOT NULL

)

GO



5.2 建立SP

TVP要設定為READONLY



5.3 建立Excel資料放到Data Table 相關程式

DataTable 欄位順序及型別要與TVP一致



5.4 建立執行SP 程式



5.5 範例DEMO

準備EXCEL檔案格式如下


瀏覽檔案後按匯入按鈕



查詢結果,成功匯入300筆資料



5.6 開啟SQL Server Profiler 來監看

利用TVP 參數的範例,與資料庫伺服器往返僅一次,且執行一秒鐘內就結束。


使用傳統方式執行,與資料庫伺服器往返300次,且執行超過10秒鐘。





6. 參考來源

MSDN資料表值參數 https://msdn.microsoft.com/zh-TW/Library/bb510489(SQL.100).aspx

利用資料表值參數(Table Valued)及預存程序來提升批次更新資料的速度

https://dotblogs.com.tw/rockchang/2016/09/21/161730

蔡雅勤