C#foreach循环中的SQL更新查询

时间:2018-02-27 22:31:18

标签: c# sql sql-update

我想在C#UPDATE循环中运行foreach SQL查询,例如:

var alterQuery = $@"
    IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE Name = 'MyColumn' AND Object_ID = Object_ID('MyTable'))
    ALTER TABLE MyTable
    ADD [MyColumn] nvarchar(255)
    ";

using (var connection = myConnection)
{
    connection.Execute(alterQuery);

    foreach (var obj in myObjects)
    {
        var query = $@"UPDATE [MyTable]
                       SET [MyColumn] = '{obj.Val}'
                       WHERE [ID] = '{obj.ID}'
                      ";

        // note: my Execute method uses ExecuteNonQuery() behind the scenes
        connection.Execute(query);
    }
}

但是,我收到以下SQL异常。如果myObjects中有两个或更多值,但是只有一个值时,我会收到它:

  

其他信息:每个表中的列名必须是唯一的。表MyTable中的列名MyColumn被多次指定。

我认为这可能是由于查询同时运行并尝试访问同一列(MyColumn)。我应该以这样的方式运行我的查询,每个人必须等到上一次完成吗?

如何成功运行这些查询?

1 个答案:

答案 0 :(得分:0)

我通过在BEGIN查询周围添加ENDALTER TABLE解决了这个问题。

不起作用:

IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE Name = 'MyColumn' AND 
Object_ID = Object_ID('MyTable'))
ALTER TABLE MyTable
ADD [MyColumn] nvarchar(255)

使用:

IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE Name = 'MyColumn' AND 
Object_ID = Object_ID('MyTable'))
BEGIN
ALTER TABLE MyTable
ADD [MyColumn] nvarchar(255)
END

我觉得奇怪的是,在非工作的情况下,IF NOT EXISTS检查控制的唯一行是ALTER TABLE MyTable行,而不是{{1和ALTER TABLE MyTable行,应该被解释为一个语句。