透過名單>> SQL 預存程序:更好的方法
正如經常遇到的那樣,將多個項目加載到特定資料庫記錄可能會帶來挑戰。考慮這樣一個場景:網頁允許使用者選擇報告項目,並且這些項目對應於資料庫中的記錄(分別為報告表和項目表)。提交後,資料庫會更新新增至 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中文網其他相關文章!