【问题标题】:Temp table in Azure SQL Server returns error on second insert in Stored ProcedureAzure SQL Server 中的临时表在存储过程中第二次插入时返回错误
【发布时间】:2015-01-20 23:48:46
【问题描述】:

我在 Azure SQL Server 实例的存储过程中声明了一个临时表。

声明后

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

并在几个INSERT 语句中使用它,SQL Server 在第二个INSERT 返回错误invalid object name 'temp'.

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

【问题讨论】:

    标签: sql-server tsql azure azure-sql-database


    【解决方案1】:

    WITH 关键字用于初始化 CTE(命令表表达式),它不是临时表。

    临时表以井号为前缀###(全球临时表,不同之处请谷歌)。

    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 
    

    临时表

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

    SELECT * INTO #Temp 
    FROM goaltable 
    WHERE someCondition = true
    

    现在这个#Temp 表的范围是创建它的连接。您可以在此会话中的任何位置多次从中选择。

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

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

    注意

    尽管临时表的范围是您的会话,但是一旦您使用完临时表,最好删除它们。

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

    【讨论】:

    • 我明白了,感谢您的澄清!我发现 T-SQL 文档对于大多数事情来说有点压倒性,但这完美地回答了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多