执行SQL任务时,将删除SSIS ## tmptable

时间:2015-05-26 13:59:25

标签: sql-server ssis temp-tables

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

enter image description here

我也对所有组件进行了延迟验证

enter image description here

在其他查询后我使用这个动态临时表 这失败了(有时)说临时表不存在。

我该如何解决?

这是我的询问..

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

2 个答案:

答案 0 :(得分:0)

我会使用标准的SSIS对象。 我真的不能遵循你的脚本的最终目标,但通常是:

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

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

答案 1 :(得分:0)

  

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

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

我建议您使用本地表变量并使用INSERT EXEC填充它们。

还有some other ways too