2017-07-26 51 views
1

我已经在线查看并且无法轻松地将变量放入打开的查询中,因此我修改了查询,并且它说#TempOT临时表是“无效的对象名称” TempOT”。”我做错了什么导致临时表不能填充?从打开的查询中将数据插入临时表

BEGIN 
IF OBJECT_ID('tempdb..#TempOT') IS NOT NULL 
BEGIN 
    DROP TABLE #TempOT 
END; 

DECLARE @TSQL As varchar(1024) 
DECLARE @AS400Query As varchar(1024) 
SET @AS400Query = 'SELECT * from blah.blahlibrary.AS400Table where DATETS BETWEEN '+ @BegofMonthForAS400 + ' AND ' + @DateForAS400 
SET @TSQL = 'SELECT * FROM OPENQUERY(ISERIES,' + '''' + @AS400Query +'''' + ')' 

INSERT INTO #TempOT 
EXEC(@TSQL) 
END 

我也尝试这样做,这是行不通的

BEGIN 
IF OBJECT_ID('tempdb..#TempOT') IS NOT NULL 
BEGIN 
    DROP TABLE #TempOT 
END; 

DECLARE @TSQL As varchar(1024) 
DECLARE @AS400Query As varchar(1024) 
SET @AS400Query = 'SELECT * from valdosta.PRDATA.PRTIMELM where DATETS BETWEEN '+ @BegofMonthForAS400 + ' AND ' + @DateForAS400 
SET @TSQL = ' INSERT INTO #TempOT SELECT * FROM OPENQUERY(ISERIES,' + '''' + @AS400Query +'''' + ')' 


EXEC(@TSQL) 

END 

回答

2

你删除临时表,然后你正在尝试将数据插入到它。 您需要先在您的脚本中创建TEMP表。

+0

如果存在具有该对象ID的现有临时表,那么当我插入它时应该自动创建具有镜像源表的列名和数据类型的表。但这并未发生。如果我评论drop table语句,我会得到同样的错误。我看到的每个地方都在说它应该是这样的。我有点困惑,为什么它的失败诚实 – Gio

0

问题其实是你在EXEC声明中创建临时表。创建的表#TempOT在批次执行后立即丢弃,并且对于主查询不可见。至少有两种可能(如果你想使用临时表):

  1. 而不是创建本地临时表,创建全局临时表##之前表名(它们之间的区别解释here)。在我看来,你应该在主要查询结束时删除这张表。

  2. 创建#TempOtEXEC声明之前的所有列在哪里你将能够没有问题地填写表#TempOt与所需的数据。