我想在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)。我应该以这样的方式运行我的查询,每个人必须等到上一次完成吗?
如何成功运行这些查询?
答案 0 :(得分:0)
我通过在BEGIN
查询周围添加END
和ALTER 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
行,应该被解释为一个语句。