首頁 >資料庫 >mysql教程 >表值參數如何改進向 SQL 預存程序傳遞清單?

表值參數如何改進向 SQL 預存程序傳遞清單?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-01 11:39:11168瀏覽

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

透過名單>> 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn