合格リスト<> 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 サイトの他の関連記事を参照してください。