SQL Serverでは、複数行のデータをストアドプロシージャへまとめて渡したい場合、テーブル値パラメータ(TVP)を利用できます。1件ずつパラメータを渡す方法では処理回数が増えてしまいますが、TVPを使うことでテーブル形式のデータを一括で渡すことが可能になります。
この記事では、SQL Serverのテーブル値パラメータ(TVP)の基本的な仕組みや、ユーザー定義テーブル型の作成方法、ストアドプロシージャへ渡す具体的な利用例について解説します。
SQL Serverのテーブル値パラメータ(TVP)とは
テーブル値パラメータ(Table-Valued Parameter)は、SQL Serverで用意されている機能で、テーブル形式のデータをストアドプロシージャや関数へ渡すために利用します。
通常のパラメータでは、整数や文字列など1つの値しか渡せません。しかし、TVPを利用すると複数行・複数列のデータを1つのパラメータとして渡せます。
例えば、注文情報を100件登録したい場合、通常なら100回INSERT処理を呼び出す必要があります。TVPを利用すると、100件分のデータをテーブルとしてまとめて渡し、ストアドプロシージャ側で一括処理できます。
TVPを利用するメリット
テーブル値パラメータには、大量データを扱う処理で多くのメリットがあります。
- 複数行データを一度の呼び出しで渡せる
- ネットワーク通信回数を減らせる
- ストアドプロシージャ側でJOINやINSERT処理が利用できる
- 一時テーブルより管理しやすい場合がある
例えば、Webアプリケーションから選択された複数の商品IDをSQL Serverへ渡して処理する場合、カンマ区切り文字列などで渡すよりも、TVPを利用した方が安全で扱いやすくなります。
SQL Serverでユーザー定義テーブル型を作成する
TVPを利用するには、まず渡すデータの形式を定義するユーザー定義テーブル型を作成します。
例えば、商品IDと数量を渡すためのテーブル型を作成する場合は、以下のようになります。
CREATE TYPE ProductListType AS TABLE
(
ProductId INT,
Quantity INT
);
このCREATE TYPEによって、SQL Server内で利用可能なテーブル形式の型が作成されます。
作成した型は、通常の変数のように扱うのではなく、主にストアドプロシージャのパラメータとして利用します。
ストアドプロシージャでTVPを受け取る方法
作成したテーブル型は、ストアドプロシージャのパラメータとして指定できます。
例えば、商品情報を登録するストアドプロシージャの場合は以下のように定義します。
CREATE PROCEDURE InsertProducts
@Products ProductListType READONLY
AS
BEGIN
INSERT INTO Products(ProductId, Quantity)
SELECT ProductId, Quantity
FROM @Products;
END;
ポイントは、TVPのパラメータには必ずREADONLYを指定することです。SQL Serverの仕様上、ストアドプロシージャ内でTVPの内容を直接変更することはできません。
ただし、TVPから別のテーブルへINSERTしたり、SELECTで参照したりすることは可能です。
アプリケーションからTVPを渡す方法
SQL ServerのTVPは、C#などのアプリケーションからも利用できます。
例えば.NETアプリケーションでは、DataTableを作成してSqlParameterとして渡す方法が一般的です。
DataTable table = new DataTable();
table.Columns.Add("ProductId", typeof(int));
table.Columns.Add("Quantity", typeof(int));
table.Rows.Add(1, 5);
table.Rows.Add(2, 10);
このDataTableをSQL Server側のユーザー定義テーブル型と一致させることで、ストアドプロシージャへ複数行データを渡せます。
WebシステムでCSV形式の大量データを登録する処理や、複数選択されたデータを一括更新する処理などで特に効果を発揮します。
TVPを利用するときの注意点
便利なTVPですが、利用時にはいくつか注意点があります。
- TVPはREADONLYであるため直接更新できない
- 大量データではインデックス設計を考慮する必要がある
- SQL Serverのバージョンによって対応状況を確認する
また、数百万件規模のデータを頻繁に渡す場合は、TVPだけではなく一括コピー機能や一時テーブルなど、別の方法が適している場合もあります。
例えば数十件から数千件程度のデータをストアドプロシージャへ渡す用途ではTVPが適していますが、巨大なデータ移行処理では専用のバルク処理を検討するとよいでしょう。
TVPと一時テーブルの使い分け
TVPと一時テーブルは似た用途で使われることがありますが、役割が異なります。
| 項目 | TVP | 一時テーブル |
|---|---|---|
| 主な用途 | 外部からデータを渡す | SQL内部で一時的に利用する |
| 変更 | 読み取り専用 | 自由に変更可能 |
| 作成方法 | ユーザー定義型 | CREATE TABLE |
アプリケーションからSQL Serverへデータを渡したい場合はTVPが向いており、ストアドプロシージャ内部で加工処理を行いたい場合は一時テーブルが適しています。
まとめ
SQL Serverでは、テーブル値パラメータ(TVP)を利用することで、テーブル形式のデータをストアドプロシージャへ渡すことができます。
TVPを利用するには、ユーザー定義テーブル型を作成し、ストアドプロシージャ側でREADONLYパラメータとして受け取ります。
大量の登録処理や複数データの一括更新では、1件ずつ処理するよりも高速で効率的な設計が可能になります。データ量や処理内容に応じて、TVP・一時テーブル・バルク処理を使い分けることが重要です。


コメント