【问题标题】:"Invalid object name" when using global temp table in stored procedure在存储过程中使用全局临时表时出现“无效的对象名称”
【发布时间】:2018-03-27 16:09:07
【问题描述】:

我按照几个例子来使用global temp table 比如this & this

我有以下查询将数据放入global temp table

DECLARE @SQL NVARCHAR(MAX)

SET @SQL = N'SELECT * INTO ##tmpDraftTableData  
             FROM ' + @DraftTableName 

EXEC sp_executesql @SQL

注意@DraftTableName是动态的,来自不同结构的不同表,这就是为什么我需要使用动态查询

然后我想将从上面全局temp table获取的数据插入到另一个临时表中以循环和处理数据:

SELECT *
INTO #tmpDraftTableData
FROM ##tmpDraftTableData  -- ERROR: Invalid object name ##tmpDraftTableData

似乎我无法使用全局临时表并出现错误

无效的对象名称##tmpDraftTableData

与其他示例代码不同。

我在这里做错了什么?

【问题讨论】:

  • “...进入另一个临时表以循环和处理数据”。如果您知道循环数据应该具有哪些列或结构,您是否介意考虑创建一个众所周知的临时表并从@DraftTableName 插入您需要的列?如果临时表是在动态 SQL 之外创建的,您也可以在动态 SQL 之外选择它的内容。

标签: tsql sql-server-2014 global-temp-tables


【解决方案1】:

试试这个:

CREATE TABLE ##tmpDraftTableData (ID INT)
INSERT INTO ##tmpDraftTableData VALUES(1)
INSERT INTO ##tmpDraftTableData VALUES(2)
INSERT INTO ##tmpDraftTableData VALUES(3)

DECLARE @SQL NVARCHAR(MAX), @DraftTableName VARCHAR(100)='##tmpDraftTableData'

SET @SQL = N'SELECT * 
            INTO #tmpDraftTableData  
             FROM ' + @DraftTableName +'

             SELECT * FROM #tmpDraftTableData
             '

您可以直接执行查询,而不是使用sp_executesql

PRINT (@SQL)
EXEC (@SQL)

输出:

ID
1
2
3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多