从打开的查询中将数据插入临时表

时间:2017-07-26 23:53:06

标签: sql-server tsql

我已经在线查看,你不能轻易地将变量放入一个打开的查询中,所以我修改了我的查询,它说#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 个答案:

答案 0 :(得分:2)

您删除TEMP表,然后尝试将数据插入其中。 您需要先在脚本中创建TEMP表。

答案 1 :(得分:0)

问题实际上是您在EXEC语句中创建临时表。在批处理执行后立即删除创建的表#TempOT,并且主查询不可见。至少有两种可能性(如果你想使用临时表):

  1. 不是创建本地临时表,而是在表名之前创建带有##的全局临时表(解释它们之间的差异为here)。在我看来,您应该在主查询结束时删除此表。

  2. 使用#TempOt语句之前的所有列创建EXEC,您可以毫无问题地使用所需数据填充表#TempOt