ホームページ > データベース > mysql チュートリアル > テーブル値パラメーターを使用すると、SQL ストアド プロシージャへのリストの受け渡しをどのように改善できるでしょうか?

テーブル値パラメーターを使用すると、SQL ストアド プロシージャへのリストの受け渡しをどのように改善できるでしょうか?

Mary-Kate Olsen
リリース: 2025-01-01 11:39:11
オリジナル
185 人が閲覧しました

How Can Table-Valued Parameters Improve Passing Lists to SQL Stored Procedures?

合格リスト<> SQL ストアド プロシージャへの: より良いアプローチ

よくあることですが、特定のデータベース レコードに複数の項目をロードすると、課題が発生する可能性があります。 Web ページでユーザーがレポートのアイテムを選択でき、これらのアイテムがデータベース内のレコード (それぞれレポート テーブルとアイテム テーブル) に対応するシナリオを考えてみましょう。送信すると、選択したアイテムが ReportItems テーブル (ReportId、ItemId) に追加されてデータベースが更新されます。

従来、これを処理するには SQL コマンドとストアド プロシージャが必要でした。ただし、SQL Server 2008 でのテーブル値パラメーター (TVP) の導入により、優れたソリューションが提供されます。

テーブル値パラメーター

TVP では、項目のリストを渡すことができます。単一のデータセットとしてストアド プロシージャに変換できるため、文字列の連結やパラメータの繰り返しの挿入が不要になります。代わりに、TVP はテーブル タイプとして定義され、ストアド プロシージャで受信されます。

コードの実装

コード内で、AddItemsToReport メソッドを変更して、 TVP は次のようになります:

public void AddItemsToReport(string connStr, int Id, List<int> itemList)
{
    Database db = DatabaseFactory.CreateDatabase(connStr);

    string sqlCommand = "AddItemsToReport";
    DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);

    // Create TVP DataTable
    DataTable itemTable = new DataTable("Items");
    itemTable.Columns.Add("ItemId", typeof(int));

    // Fill TVP DataTable
    foreach (int item in itemList)
        itemTable.Rows.Add(item);

    // Add TVP parameter
    db.AddParameter(dbCommand, "Items", DbType.Object, itemTable);
    db.ExecuteNonQuery(dbCommand);
}
ログイン後にコピー

プロシージャ:

INSERT INTO ReportItem (ReportId, ItemId)
SELECT  ReportId,
          ItemId
FROM     @Items
ログイン後にコピー

利点

TVP には、以前のアプローチに比べていくつかの利点があります。

  • コードを簡素化および合理化します
  • パラメータの挿入を減らすことでパフォーマンスを向上させますオーバーヘッド
  • リスト内の項目が正しいタイプであることを確認することでデータの整合性を強化します

互換性に関する考慮事項

TVP サポートはSQL Server 2008 は、そのバージョン以降に限定されます。以前のバージョンの SQL Server を扱う場合は、XML パラメーターやユーザー定義関数などの代替ソリューションを検討する必要がある場合があります。

以上がテーブル値パラメーターを使用すると、SQL ストアド プロシージャへのリストの受け渡しをどのように改善できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート