You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET Core MVC中用EF Core创建SQL Server临时表?解决报错问题

问题原因

报错Invalid object name '##TempTable'的核心原因是:EF Core默认每次调用ExecuteSqlRaw时会单独打开并关闭数据库连接。SQL Server的全局临时表(##前缀)会在创建它的连接关闭后自动销毁(无其他会话使用时),因此第一次执行CREATE TABLE后连接关闭,临时表已被删除,第二次INSERT操作自然找不到该表。

解决方案

方案1:合并SQL语句,单次执行

将创建表和插入数据的SQL合并为一个语句,确保在同一个连接中完成所有操作:

[NonAction]
public IActionResult InsertData()
{
    _Db._context.Database.ExecuteSqlRaw(@"
        CREATE TABLE ##TempTable (Id INT, Name NVARCHAR(50));
        INSERT INTO ##TempTable (Id, Name) VALUES (1, 'John'), (2, 'Jane');
    ");
    
    return RedirectToAction("Index");
}

方案2:使用事务共享连接

通过开启事务,让两次ExecuteSqlRaw共用同一个数据库连接:

[NonAction]
public IActionResult InsertData()
{
    using var transaction = _Db._context.Database.BeginTransaction();
    try
    {
        _Db._context.Database.ExecuteSqlRaw("CREATE TABLE ##TempTable (Id INT, Name NVARCHAR(50))");
        _Db._context.Database.ExecuteSqlRaw("INSERT INTO ##TempTable (Id, Name) VALUES (1, 'John'), (2, 'Jane')");
        
        transaction.Commit();
    }
    catch
    {
        transaction.Rollback();
        throw;
    }
    
    return RedirectToAction("Index");
}

方案3:改用局部临时表(按需选择)

如果不需要跨会话访问临时表,建议改用局部临时表(#前缀),同样遵循“同一连接内操作”的原则:

[NonAction]
public IActionResult InsertData()
{
    _Db._context.Database.ExecuteSqlRaw(@"
        CREATE TABLE #TempTable (Id INT, Name NVARCHAR(50));
        INSERT INTO #TempTable (Id, Name) VALUES (1, 'John'), (2, 'Jane');
    ");
    
    return RedirectToAction("Index");
}
注意事项
  • 全局临时表(##)可被所有数据库会话访问,但创建它的连接关闭后,若没有其他会话正在使用,会立即被删除。
  • 局部临时表(#)仅属于当前会话,连接关闭后自动销毁,安全性更高,适合单会话内的临时数据处理。

内容的提问来源于stack exchange,提问作者Humail Saleem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:27:06