首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> SQL Server 2005

SQL Server 2005 利用 XML 批次更新多筆記錄:存儲過程與 C# 實作

     編輯:SQL Server 2005

問題背景

需一次更新書本主檔與多筆章節明細(N < 1000)。若逐筆呼叫 Stored Procedure,1000 並發將產生 100 萬次資料庫往返,嚴重拖垮效能。解決方案:將明細序列化為 XML 字串,單次呼叫 SP 解析批次寫入。

資料庫端:解析 XML 的存儲過程

CREATE PROCEDURE UP_Book_Insert
    @BookId INT,
    @ChapterXml XML
AS
BEGIN
    -- 使用暫存表或表值變數接收解析結果
    CREATE TABLE #ChapterTmp (
        ChapterId INT,
        ChapterName VARCHAR(255),
        Price INT
    )

    INSERT #ChapterTmp
    SELECT
        X.C.value('Id[1]', 'int') AS ChapterId,
        X.C.value('Name[1]', 'varchar(255)') AS ChapterName,
        X.C.value('Price[1]', 'int') AS Price
    FROM @ChapterXml.nodes('Chapter') AS X(C)  -- X(C) 為必要的命名空間別名

    -- 批次寒入目標表
    INSERT INTO tbChapter (BookId, ChapterId, ChapterName, Price)
    SELECT @BookId, ChapterId, ChapterName, Price FROM #ChapterTmp
END

呼叫範例

EXEC UP_Book_Insert 10000,
'268第268章100
273第273章100
275第275章100'

C# 端:產生 XML 字串

public static string FormatXmlInfo(List<ChapterInfo> list)
{
    if (list == null || list.Count == 0) return String.Empty;

    var sb = new StringBuilder();
    foreach (var info in list)
    {
        sb.AppendFormat("<Chapter><Id>{0}</Id><Name>{1}</Name><Price>{2}</Price></Chapter>",
            info.ChapterId, info.ChapterName, info.Price);
    }
    return sb.ToString();
}

// 呼叫 SP
using (var cmd = new SqlCommand("UP_Book_Insert", conn) { CommandType = CommandType.StoredProcedure })
{
    cmd.Parameters.AddWithValue("@BookId", bookId);
    cmd.Parameters.AddWithValue("@ChapterXml", xmlString);  // DbType.String 即可
    cmd.ExecuteNonQuery();
}

進階優化建議

  • 移除暫存表:直接 `INSERT INTO tbChapter ... SELECT @BookId, ... FROM @ChapterXml.nodes(...)` 避免臨時物件開銷。
  • 使用表值參數 (TVP):SQL Server 2008+ 推薦使用 CREATE TYPE ... AS TABLE 配合 `SqlParameter.TypeName`,比 XML 解析更快、型別安全。
  • 批次大小控制:單次 XML 超過 10MB 可能影響記憶體,建議分批 500~1000 筆。
  • 索引策略:目標表 `BookId` 應有索引,支援後續查詢。

效能對比(質化分析)

方案資料庫往返網路封包解析開銷適用版本
逐筆 SPN 次N 個無所有版本
XML 批次1 次1 個低 (XQuery)2005+
TVP 批次1 次1 個極低 (原生)2008+
BULK INSERT1 次串流最低所有版本

實測 1000 筆章節:XML 批次約 50-100ms,逐筆約 3-5 秒(含網路延遲)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved