【问题标题】:Invalid Object name ##Temp Error when creating a global temporary tableInvalid Object name ##Temp 创建全局临时表时出错
【发布时间】:2017-11-09 02:23:08
【问题描述】:

我有几个表中的数据,我想将它们加载到 SQL Server 中的临时表中。

我正在创建一个从表中获取数据的存储过程。然后我创建全局临时表并将存储过程的结果插入其中。

但是,当尝试从临时表中选择数据时,出现此错误 '无效的对象名称##Temp'

如果是全局临时表,为什么会出现此错误?

DROP PROCEDURE usp_GetEmp
GO
CREATE PROCEDURE usp_GetEmp
AS
BEGIN
    SELECT table1.id AS Id
      , table2.data AS table2_value
  FROM table1 INNER JOIN table2
  ON table1.id = table2.table1_id
  WHERE table2.data = 1
END

  CREATE TABLE ##Temp
  ( Id Int
  , Value varchar(50))

  INSERT INTO ##Temp
  EXEC usp_GetEmp
  GO

  SELECT *
  FROM ##Temp

【问题讨论】:

  • 全局临时表表明您的设计有些偏差。它们充满了并发性和范围问题。你那里有一个GO。否则,您的创建表等都将在过程中。
  • 哇,这就是问题所在。我最初没有它有一个全局临时表,但我认为错误是因为它不是所以我将它更改为全局范围。它不再是全球性的并且有效。谢谢!
  • 您确实意识到您的存储过程包含Create TableInsert Into 语句,因为您的GO 语句在哪里。归功于下面的@Fabiano。直到现在我才看到他的回答。

标签: sql sql-server tsql temp-tables


【解决方案1】:

试试看

DROP PROCEDURE USP_GETEMP
GO
CREATE PROCEDURE USP_GETEMP
AS
BEGIN
SELECT 
    TABLE1.ID AS ID
    ,TABLE2.DATA AS TABLE2_VALUE
FROM TABLE1 INNER JOIN TABLE2
ON TABLE1.ID = TABLE2.TABLE1_ID
WHERE TABLE2.DATA = 1
END
GO

IF OBJECT_ID('TEMPDB.DBO.##TEMP') IS NOT NULL
DROP TABLE ##TEMP
GO
CREATE TABLE ##TEMP
( ID INT
, VALUE VARCHAR(50))

INSERT INTO ##TEMP
EXEC USP_GETEMP
GO

SELECT *
FROM ##TEMP

【讨论】:

    猜你喜欢
    • 2019-06-16
    • 2015-04-25
    • 2016-04-02
    • 2023-04-08
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多