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

SQL DELETE 多條件刪除:IN 運算子單語句批次刪除指定 ID

     編輯:關於SqlServer

需一次刪除多個指定 ID 時,絕對不要迴圈執行單條 DELETE,應使用 IN 運算子單語句完成,減少網路往返、鎖升級與交易記錄碎片。

問題場景

-- 錯誤做法:應用層迴圈
For Each id In idList
    cmd.CommandText = "DELETE FROM T_Net_Hailfellow WHERE ID = " & id
    cmd.ExecuteNonQuery
Next

正確做法:IN 運算子

-- 單語句刪除多個 ID
DELETE FROM T_Net_Hailfellow WHERE ID IN (10, 25, 37, 101, 205);

參數化動態建構 (防 SQL Injection)

-- C# 範例
Dim idList As New List(Of Integer) From {10, 25, 37, 101, 205}
Dim placeholders = String.Join(",", idList.Select(Function(i, idx) "@p" & idx))
Dim sql = "DELETE FROM T_Net_Hailfellow WHERE ID IN (" & placeholders & ")"

Using cmd As New SqlCommand(sql, conn)
    For i = 0 To idList.Count - 1
        cmd.Parameters.AddWithValue("@p" & i, idList(i))
    Next
    cmd.ExecuteNonQuery()
End Using

大量 ID 分批策略

  • SQL Server 單一 IN 清單建議 不超過 1000-2000 個參數 (參數上限 2100),超過請分批。
  • 極大量刪除 (萬筆以上) 建議:
-- 1. 建立暫存表/表值參數載入 ID
CREATE TABLE #DelIDs (ID INT PRIMARY KEY);
INSERT INTO #DelIDs VALUES (10), (25), ...;  -- 或用 Table-Valued Parameter

-- 2. 聯結刪除
DELETE t FROM T_Net_Hailfellow t INNER JOIN #DelIDs d ON t.ID = d.ID;

-- 3. 或用 EXISTS
DELETE FROM T_Net_Hailfellow WHERE EXISTS (SELECT 1 FROM #DelIDs d WHERE d.ID = ID);

效能比較 (參考)

方式500 筆耗時網路往返鎖持有時間
迴圈單條 DELETE~2.5 秒500長 (累積)
IN 列表單語句~0.08 秒1短
暫存表聯結~0.05 秒1 (+ 批次插入)最短

關鍵提醒

  • 無 WHERE 的 DELETE 會清空全表 — 生產環境嚴禁。
  • TRUNCATE TABLE 速度最快但不可帶條件、會重置 IDENTITY、不啟動觸發器、需 ALTER 權限。
  • 刪除前先 SELECT * FROM table WHERE ID IN (...) 驗證資料正確性。
  • 大量刪除後考慮 UPDATE STATISTICS 或重建索引。

善用 IN 與參數化,讓批次刪除既安全又高效。

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