[英]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.