Azure SQL 服务器 returns 中的临时 table 在存储过程中第二次插入时出错

Temp table in Azure SQL Server returns error on second insert in Stored Procedure

我在 Azure SQL 服务器实例的存储过程中声明了一个临时 table。

声明后
WITH temp 
    (cols) AS 
    (SELECT * FROM goaltable 
    WHERE someCondition = true)

并在几个 INSERT 语句中使用它,SQL 服务器 returns 第二个错误 INSERT invalid object name 'temp'.

我是否必须在第二个 INSERT 语句之前再次声明 table,或者有更好的方法吗?

WITH 关键字用于初始化 CTE (Comman Table Expression),它不是临时 Table。

Temp Table 以井号 ### 为前缀(Global Temp tables,google 用于区别)。

CTE 的范围仅限于 CTE 初始化后的第一条语句。

WITH CTE AS
 ( /* Your query here */)
 SELECT FROM CTE  --<-- Scope of above CTE
                    -- it maybe select , delete, update statement here

SELECT FROM CTE    --<-- this statement is out of scope 
                     -- this will return an error 

温度Tables

在你的情况下,如果你想创建一个临时文件 table 并在多个地方使用它,你需要做这样的事情...

SELECT * INTO #Temp 
FROM goaltable 
WHERE someCondition = true

现在这个#Temp table 的范围是创建它的连接。您可以在此会话中的任何位置多次使用它 select。

例如,只要在同一连接中执行以下查询,它们将不会出现任何错误。

SELECT TOP 10 * FROM #Temp
SELECT * FROM #Temp

备注

即使 temp table 的范围是您的会话,但是在您完成使用它们后删除 temp tables 是一个很好的做法。

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL 
  DROP TABLE #Temp