簡體   English   中英

用於動態大小刪除和插入的SQL參數

[英]SQL parameters for dynamic size deletes and inserts

我有一個可以復制數據並進行修改等的服務。功能之一就是直接在數據庫中復制刪除和插入操作,使用Entity可以輕松實現,但不幸的是,較大的查詢變得相當慢,因此我希望直接運行它作為原始SQL查詢。

現在,這采用了foreach循環的形式,並根據提供的內容建立查詢

if(deletes.Count() > 0) 
{
    // Build up delete string
    StringBuilder sqlCommand = new StringBuilder("DELETE FROM RandomTable WHERE ");

    List<string> rows = new List<string>();

    foreach(var item in query)
    {
        rows.Add(string.Format("(Key1 = '{0}' AND Key2 = '{1}' AND Key3 = '{2}' AND Key4 = '{3}' AND Key5 = '{4}')",
                               item.Key1, item.Key2, item.Key3, item.Key4, item.Key5));
    }

    sqlCommand.Append(string.Join(" OR ", rows));
    sqlCommand.Append(";");
    runyoubadthing(sqlCommand);
}

(請注意,我要刪除引號和垃圾,但此示例不需要)。現在,我知道它們需要進行參數化(但是以上內容僅在數據庫之間進行通信的服務中,因此從技術上講不需要它,但是我仍然希望遵循良好的做法)。

我的問題是:如何在適當的參數化查詢中執行上述操作,使其可以作為單個查詢運行,而不是作為數千個單個刪除運行,這將花費更長的時間?

旁注:使用單個自動遞增ID可以使整個折磨過程提高大約1000倍,不幸的是,這不是我的數據庫,現在我不得不處理多達10個主鍵夢night以查找唯一數據

您可以嘗試這樣的事情:

var Command = new SQLCommand {
    CommandText = "DELETE FROM RandomTable WHERE ",
    Connection = yourConnection
};
var count = 0;
foreach(var item in query)
{
    Command.CommandText += Command.CommandText.EndsWith("WHERE ")? "": "OR ";
    Command.CommandText += $"(Key1 = '@{count}0' AND Key2 = '@{count}1' AND Key3 = '@{count}2' AND Key4 = '@{count}3' AND Key5 = '@{count}4')";
    Command.Parameters.Add($"@{count}0", [YourDBType]).Value = item.Key1;
    Command.Parameters.Add($"@{count}1", [YourDBType]).Value = item.Key2;
    Command.Parameters.Add($"@{count}2", [YourDBType]).Value = item.Key3;
    Command.Parameters.Add($"@{count}3", [YourDBType]).Value = item.Key4;
    Command.Parameters.Add($"@{count}4", [YourDBType]).Value = item.Key5;
    count++;
}
Command.Prepare();
//Execute Command

我認為除了對每個項目執行刪除命令外,沒有其他更好的方法來解決此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM