如何在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
相关产品推荐
相关产品推荐

