WHERE IN Raw SQL 与 ExecuteSqlCommand 一起使用的查询不适用于多条记录
WHERE IN Raw SQL Query used with ExecuteSqlCommand not working for multiple records
我试图在更新多条记录时有效地使用 UPDATE
查询(而不是对每个 Id
进行循环)。
我有这个简单的方法:
public static async Task EfficientlyUpdateSentTimeforSomeTicketsAsync(List<int> Ids)
{
var parameters = Ids.Select((id, index) => new SqlParameter(string.Format("@p{0}", index), id));
var parameterNames = string.Join(", ", parameters.Select(p => p.ParameterName));
var query = string.Format("Update [TicketQueueTable] Set SentDatetime = {1} WHERE TicketQueueID IN ({0})", parameterNames, DateTime.Now);
try
{
using (var db = GetDbContext())
{
var affectedRows = await db.Database.ExecuteSqlCommandAsync(query, parameters.ToArray());
}
}
catch (Exception ex)
{
await LogErrorAsync(ex);
throw ex;
}
}
我从这个 SO 问题中得到了帮助: 但我无法完成这项工作。它让我异常震惊:
Incorrect syntax near '2'
为简单起见,我现在要发送的 ID 是 new List<int>() { 1, 2 }
。
感谢您的宝贵时间。
类似这样的东西:(我没有测试,可能有错字)
var parameterNames = string.Join(", ", Ids.Select(p => "("+ x.id.ToString()+")"));
var query = string.Format(@"Update TicketQueueTable
Set SentDatetime = '{1}'
FROM TicketQueueTable
JOIN (
VALUES
{0}
) AS L(ID) ON TicketQueueTable.Ticket.TicketQueueID = L.ID;", parameterNames, DateTime.Now)
如果你想使用一个参数(你应该使用)然后将其设为 table 参数并在 table 中包含值列表并加入它。
您正在创建的字符串如下所示
Update [TicketQueueTable] Set SentDatetime = 3/6/2020 2:30:18 AM WHERE TicketQueueID IN (@p0, @p1)
如果您尝试使用 sql 工具(例如 SQL Server Management Studio)执行该命令,您将收到此错误。
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '2'.
加上 2:30:18 AM 中的 2 带有红色下划线。
您有两个选择:
- 引用日期时间
var query = string.Format("Update [TicketQueueTable] Set SentDatetime = '{1}' WHERE TicketQueueID IN ({0})", parameterNames, DateTime.Now);
- 使用 sql 函数获取 sql 服务器的当前时间
var query = string.Format("Update [TicketQueueTable] Set SentDatetime = GETDATE() WHERE TicketQueueID IN ({0})", parameterNames, DateTime.Now); // GETDATE() for MSSQL NOW() for MySQL
- 将日期时间作为参数传入
public static async Task EfficientlyUpdateSentTimeforSomeTicketsAsync(List<int> Ids)
{
var parameters = Ids.Select((id, index) => new SqlParameter(string.Format("@p{0}", index), id)).ToList();
var parameterNames = string.Join(", ", parameters.Select(p => p.ParameterName));
var query = string.Format("Update [TicketQueueTable] Set SentDatetime = @p{1} WHERE TicketQueueID IN ({0})", parameterNames, parameters.Count());
parameters.Add(new SqlParameter($"@p{parameters.Count()}", DateTime.Now));
try
{
using (var db = GetDbContext())
{
var affectedRows = await db.Database.ExecuteSqlCommandAsync(query, parameters.ToArray());
}
}
catch (Exception ex)
{
await LogErrorAsync(ex);
throw ex;
}
}
我试图在更新多条记录时有效地使用 UPDATE
查询(而不是对每个 Id
进行循环)。
我有这个简单的方法:
public static async Task EfficientlyUpdateSentTimeforSomeTicketsAsync(List<int> Ids)
{
var parameters = Ids.Select((id, index) => new SqlParameter(string.Format("@p{0}", index), id));
var parameterNames = string.Join(", ", parameters.Select(p => p.ParameterName));
var query = string.Format("Update [TicketQueueTable] Set SentDatetime = {1} WHERE TicketQueueID IN ({0})", parameterNames, DateTime.Now);
try
{
using (var db = GetDbContext())
{
var affectedRows = await db.Database.ExecuteSqlCommandAsync(query, parameters.ToArray());
}
}
catch (Exception ex)
{
await LogErrorAsync(ex);
throw ex;
}
}
我从这个 SO 问题中得到了帮助:
Incorrect syntax near '2'
为简单起见,我现在要发送的 ID 是 new List<int>() { 1, 2 }
。
感谢您的宝贵时间。
类似这样的东西:(我没有测试,可能有错字)
var parameterNames = string.Join(", ", Ids.Select(p => "("+ x.id.ToString()+")"));
var query = string.Format(@"Update TicketQueueTable
Set SentDatetime = '{1}'
FROM TicketQueueTable
JOIN (
VALUES
{0}
) AS L(ID) ON TicketQueueTable.Ticket.TicketQueueID = L.ID;", parameterNames, DateTime.Now)
如果你想使用一个参数(你应该使用)然后将其设为 table 参数并在 table 中包含值列表并加入它。
您正在创建的字符串如下所示
Update [TicketQueueTable] Set SentDatetime = 3/6/2020 2:30:18 AM WHERE TicketQueueID IN (@p0, @p1)
如果您尝试使用 sql 工具(例如 SQL Server Management Studio)执行该命令,您将收到此错误。
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '2'.
加上 2:30:18 AM 中的 2 带有红色下划线。
您有两个选择:
- 引用日期时间
var query = string.Format("Update [TicketQueueTable] Set SentDatetime = '{1}' WHERE TicketQueueID IN ({0})", parameterNames, DateTime.Now);
- 使用 sql 函数获取 sql 服务器的当前时间
var query = string.Format("Update [TicketQueueTable] Set SentDatetime = GETDATE() WHERE TicketQueueID IN ({0})", parameterNames, DateTime.Now); // GETDATE() for MSSQL NOW() for MySQL
- 将日期时间作为参数传入
public static async Task EfficientlyUpdateSentTimeforSomeTicketsAsync(List<int> Ids)
{
var parameters = Ids.Select((id, index) => new SqlParameter(string.Format("@p{0}", index), id)).ToList();
var parameterNames = string.Join(", ", parameters.Select(p => p.ParameterName));
var query = string.Format("Update [TicketQueueTable] Set SentDatetime = @p{1} WHERE TicketQueueID IN ({0})", parameterNames, parameters.Count());
parameters.Add(new SqlParameter($"@p{parameters.Count()}", DateTime.Now));
try
{
using (var db = GetDbContext())
{
var affectedRows = await db.Database.ExecuteSqlCommandAsync(query, parameters.ToArray());
}
}
catch (Exception ex)
{
await LogErrorAsync(ex);
throw ex;
}
}