【问题标题】:Sudden removal global temporary table when call a stored procedure from C#从 C# 调用存储过程时突然删除全局临时表
【发布时间】:2012-12-12 21:44:19
【问题描述】:

我有 2 个带有动态 sql 的存储过程(ms sql 2005)。首先他们创建临时表(##Table)并填充数据。第二个过程从第一个过程创建的临时表中选择数据。

第一个sp:

set @cmd = 'create table ' + @tableName +
                            '(ORDERS_DT_ID int' +
                            ...
                            ',WAREHOUSE_RESULT numeric(15, 3)) ' +

       ' insert into ' + @tableName + ' ( ORDERS_DT_ID, ... WAREHOUSE_RESULT )' +
       ' select ro.ORDERS_DT_ID, ... ro.WAREHOUSE_RESULT ' +
         ' from WH_REMAINS_BY_ORDER_FN ( ' + cast(@orderId as varchar(10)) + ' ) as ro '

exec (@cmd)      

第二个sp(例如):

set @cmd =  'select r.ORDERS_DT_ID, ... r.WAREHOUSE_RESULT' +
                     ' from ' + @tableName + ' as r'

exec (@cmd)

其中@tableName - sp的输入参数(例如='##Table')

我使用来自 asp.net mvc 应用程序的程序。我调用第一个过程,从 MSSMS 检查临时表(表存在)然后应用程序在断点处停止(在第二个 sp 之前),接下来我调用第二个过程并且表不存在(但在第一个和第二个过程之间调用表存在)。

var result = dataContext.firstSP(table, orderId).FirstOrDefault(); // create temp table and fill data (+ return status)

var data = dataContext.secondSP( table, orderId ).AsQueryable(); // before execute we have temp table (check from MSSMS) and we have error after execute that code.

如果我们在第二个过程中检查临时表,我们可以看到该表不存在:

if object_id ( N'tempdb.dbo.' + ltrim(@tableName) ) is null
begin
    exec dbo.firstSP @tableName, @orderId            
end

为什么当我们运行第二个 sp 时,第一个 sp 的临时表会丢失?

【问题讨论】:

    标签: c# sql-server-2005


    【解决方案1】:

    一旦创建会话结束并且没有从另一个会话主动查询,全局临时表就会被删除。

    如果您想控制生命周期,请创建一个永久表(可能在 tempdb 中)

    【讨论】:

    • 但是在执行第二个 SP(断点调用)之前,我检查了表并且它存在。为什么?
    • @Xordal - 大概创建连接在那时仍然存在。
    【解决方案2】:

    当没有打开的连接查询全局临时表时,它们会被自动删除。这是最可能的原因。就个人而言,无论如何,我不会将这作为对 DB 的两个单独调用。

    我的建议是将第一个 SP 转换为表值函数,然后第二个 SP 可以简单地查询 TVF。这避免了执行 DDL 来进行两个单独的数据库调用的需要,并且通常会更容易。

    如果你真的想要一个临时表。如果您希望此生成的表在单次使用后保留更长的时间,请不要使用临时表。

    【讨论】:

      猜你喜欢
      • 2015-12-11
      • 1970-01-01
      • 2011-01-17
      • 2011-12-17
      • 1970-01-01
      • 2021-11-10
      • 2018-03-01
      • 2010-12-07
      • 1970-01-01
      相关资源
      最近更新 更多