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
我在 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