【问题标题】:SSIS ##tmptable is dropped when execute SQL task is executedSSIS ##tmptable 在执行 SQL 任务时被丢弃
【发布时间】:2015-05-26 13:59:24
【问题描述】:

在你说我之前, 我放了retainsameconnection,我放了。

我的所有组件也有延迟验证

在其他人查询我使用此动态临时表的位置之后 这失败(有时)说临时表不存在。

我该如何解决?

这是我的查询..

declare @usuario varchar(100)
declare @contra varchar(100)
declare @servidor varchar(100)
declare @based varchar(100)
declare @nombretabla varchar(100)

set @usuario ='pruebas'
set @contra ='123'
set @servidor ='1.6.7.9'
set @based ='op'

set @nombretabla='tablaBC245B7A910D4B488CC9EFF0EFD3C177'

/*this was a dynamic name got with this query in other execute sql task
declare @tabla varchar(50)
set @tabla=NEWID ()
set @tabla =REPLACE (@tabla ,'-','')

select 'tabla'+@tabla  nombre
*/

declare @cadena varchar(500)
set @cadena ='SERVER='+@servidor+';DataBasE='+@based +
  ';uid='+@usuario +';pwd='+@contra+';'

set @cadena =''''+@cadena +''''

while OBJECT_ID('tempdb..##envases'+@nombretabla) IS  NULL  
begin

    exec('
        SELECT * into ##envases'+@nombretabla+'
        FROM OPENROWSET(
            ''SQLNCLI'', 
            '+@cadena+',
            ''
            select pro=p.pro,envase=e.pro from procorp p 
            join procorp e on p.envase=e.envase and e.esenvase=1 
            union all select pro=-1,envase=-1
             '')      
         ' 
         )  
end

IF OBJECT_ID('tempdb..#primera') IS NOT NULL DROP TABLE #primera
IF OBJECT_ID('tempdb..#end') IS NOT NULL DROP TABLE #end

create table #primera(
  pro int,
  envase int
)

insert into #primera
exec('select * from ##envases'+@nombretabla+'')

select fila='select pro='+CONVERT(varchar(10),pro)+
  ', envase='+CONVERT(varchar(10),envase)+' union all ' 
into #end
from #primera

--select * from #end
--drop table #end
--drop table #primera

alter table #end
add 
uno int not null default(1),
id int identity

declare @maximo int
set @maximo =(select MAX(id) from #end )

update #end set fila=fila+'terminado' where id=@maximo
update #end set fila=replace(fila,'union all terminado','') where id=@maximo 

select uno, '  begin try drop table #tmpenvase end try begin catch  end catch  
  select * into #tmpenvase from ( '+ 
  convert(varchar(max),STUFF(
    (select  '', convert(varchar(max),fila) from #end  order by id
      for xml path('')  )
   ,1,0,'')         )+' ) q 'cadena
from #end e 
group by uno

【问题讨论】:

  • 是否有某个地方触发了这种情况?
  • 不,该代码有时可以正常工作,但现在我需要在其他国家/地区进行测试,这比在同一国家/地区的服务器上进行测试时失败的次数要多得多。现在几乎 100% 的执行都失败了。

标签: sql-server ssis temp-tables


【解决方案1】:

我会为此使用标准 SSIS 对象。 我无法真正遵循您脚本的最终目标,但通常:

可以使用配置文件、变量和其他方式管理连接字符串。 在数据流任务中,OLE DB 源转换可以运行 SELECT 语句,OLE DB 目标可以传递数据,OLE DB 命令可以运行 UPDATE 语句。

我会根据一系列任务重新构想您的需求,而不是试图将所有内容都强加到一个 T-SQL 脚本中。

【讨论】:

  • 如果我使用 SSIS 对象,我每次都需要获取相同的信息,然后使用该代码,我获得了 1 次信息,并且我在本地拥有它,这也更快。跨度>
  • 我不明白您所说的“本地”是什么意思,但我相信您最了解您的要求。祝你好运!
  • 首先我有 2 台服务器,然后我从服务器 A 获取数据,然后将其保存在服务器 B 的 ##tmpTable 中,现在(本地)在本地。
  • 就 SSIS 组件而言,可能是查找缓存 msdn.microsoft.com/en-us/library/bb895289.aspx 或原始文件 msdn.microsoft.com/en-us/library/ms141661.aspx。
【解决方案2】:

全局临时表在创建后对任何用户和任何连接都是可见的,并且在引用该表的所有用户与 SQL Server 实例断开连接时被删除。

根据 SQL Server Books-Online 的那一段;只要 SQL Server 找不到与全局临时表的任何连接,这些临时表就会被删除,并且当您使用 EXEC 命令创建本地临时表时,SQL Server 将删除该本地临时表,这也将应用于全局临时表,但在检查所有用户连接等之后。我认为有时 SQL Server 会在您的下一条语句提交之前单独找到您的全局临时表。

建议你使用局部表变量,用INSERT EXEC填充。

还有some other ways too。

【讨论】:

  • 然后我无法访问它,在其他执行 sql 任务中。
  • @angel 在没有任何连接用户的情况下,一旦 SQL Server 发现它就无法访问它,因此不建议在动态 SQL 中使用临时变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多