我有一个进程,它从Access数据库中的每日提要中获取记录,并将记录添加到SQL服务器。
负载突然失败,所以我试图通过SQL服务器全局临时表添加,然后从该临时表中更快地删除/插入。
我有以下代码在TSQL中运行:
IF OBJECT_ID ( 'tempdb.dbo.####TempCountry' ) IS NOT NULL DROP TABLE ##TempCountry;
SELECT * INTO ##TempCountry FROM dbo.Country WHERE 1 = 2;
INSERT INTO ##TempCountry (CountryCode, CountryName) VALUES ('AF','AFGHANISTAN')
SELECT * FROM ##TempCountry
我已使用EntityFramework连接将其翻译为ExecuteStoreCommand
:
using (MyEntities _ent = new MyEntities ()) {
//Create a temp table
try {
_ent.ExecuteStoreCommand("IF OBJECT_ID ( 'tempdb.dbo.##TempCountry' ) IS NOT NULL DROP TABLE ##TempCountry");
_ent.ExecuteStoreCommand("SELECT * INTO ##TempCountry FROM dbo.Country WHERE 1 = 2");
_ent.ExecuteStoreCommand("INSERT INTO ##TempCountry (CountryCode, CountryName, RegionCode) VALUES ('AF','AFGHANISTAN')");
} catch (Exception ex) {
//Generic error
Console.writeline(" Unknown error inserting Country: {0} - {1} ", sCountryCode, ex.Message);
}
} //EF
当我点击最后的ExecuteStoreCommand
时,代码抛出一个SqlException:“无效的对象名称'## TempCountry'。”
但是当我执行“select * from tempdb.dbo.sysobjects”时,我可以看到该表
答案 0 :(得分:4)
每个ExecuteStoreCommand
将在不同的会话上执行。第一个命令完成后,表将被删除。
来自MSDN - CREATE TABLE(在备注部分的临时表中):
当创建表的会话结束且所有其他任务停止引用它们时,将自动删除全局临时表。
一种解决方案是在一个SQL批处理中执行所有命令,而不是单独的命令。