动态大小的SQL参数删除和插入

时间:2017-10-12 07:18:02

标签: c# sql

我有一个复制数据和进行修改的服务。其中一个功能就是直接复制数据库中的删除和插入,这很好并且很容易使用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个主键噩梦以查找唯一数据

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

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

除了为每个项目执行删除命令之外,我认为没有更好的方法来解决这个问题。