【问题标题】:Why is the #TEMP Table not showing up?为什么#TEMP 表没有显示?
【发布时间】:2020-09-14 21:42:40
【问题描述】:

我有一个如下的存储过程,我想将其结果导出到一个表中。

DECLARE
    @ReportYearCmd VARCHAR(1000),
    @CosCountCmd VARCHAR(1000),
    @FranchiseCountCmd AS VARCHAR(1000),
    @ProductCountCmd AS VARCHAR(1000);

WITH Validations AS (
    SELECT TOP 1 * FROM [Handshake] WHERE [Status] = 'Loaded' AND [Update Time] = ( SELECT MAX( [Update Time] ) FROM Handshake )
)
UPDATE Validations 
SET 
    @ReportYearCmd = CASE WHEN Report_Year_Count = 0 THEN NULL 
        ELSE 'SELECT DISTINCT [Report Year] AS [Report Year] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Report Year] WHERE [Report Year].[Report Year] = [Fact].[Report Year] );'
    END,
    @CosCountCmd = CASE WHEN COS_Count = 0 THEN NULL 
        ELSE 'SELECT DISTINCT [Country Code] AS [COS - Country Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [COS] WHERE [COS].[Country Code] = [Fact].[Country Code] );' 
    END,
    @FranchiseCountCmd = CASE WHEN  Franchise_Count = 0 THEN NULL 
        ELSE 'SELECT DISTINCT [Style Code] AS [Franchise - Style Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Franchise] WHERE [Franchise].[Style Code] = [Fact].[Style Code] );' 
    END,
    @ProductCountCmd = CASE WHEN Product_Count = 0 THEN NULL 
        ELSE 'SELECT DISTINCT [Style Code] AS [Product - Style Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Product] WHERE [Product].[Style Code] = [Fact].[Style Code] );' 
    END,
    [Status] = CASE
        WHEN ( Report_Year_Count = 0 AND COS_Count = 0 AND Franchise_Count = 0 AND Product_Count = 0 ) THEN 'Good'
        ELSE 'Rejects'
    END
FROM [Validations] 
OUTER APPLY (

    SELECT 
        ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Report Year] WHERE [Report Year].[Report Year] = [Fact].[Report Year] ) ), 0 ) AS [Report_Year_Count],
        ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [COS] WHERE [COS].[Country Code] = [Fact].[Country Code] ) ), 0 ) AS [COS_Count],
        ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Franchise] WHERE [Franchise].[Style Code] = [Fact].[Style Code] ) ), 0 ) AS [Franchise_Count],
        ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Product] WHERE [Product].[Style Code] = [Fact].[Style Code] ) ), 0 ) AS [Product_Count]

) AS [ValidationCounts];

-- Return validation sql statements --

SELECT
    @ReportYearCmd AS ReportYearCmd,
    @CosCountCmd AS CosCountCmd,
    @FranchiseCountCmd AS FranchiseCountCmd,
    @ProductCountCmd AS ProductCountCmd;

-- Insert actual SQL statament results into Rejects Table --

IF(OBJECT_ID('tempdb..#TEMP') IS NOT NULL) 
BEGIN DROP TABLE #TEMP END
SELECT
    ReportYearCmd, CosCountCmd, FranchiseCountCmd, ProductCountCmd
INTO #TEMP
FROM (
    SELECT 
    @ReportYearCmd AS ReportYearCmd,
    @CosCountCmd AS CosCountCmd,
    @FranchiseCountCmd AS FranchiseCountCmd,
    @ProductCountCmd AS ProductCountCmd
    ) AS [RejectsTable]

这仅从第一个 select 语句返回验证语句,但我没有看到 RejectTable 显示来自这些 SQL 语句的实际拒绝...

目前,当我执行此 SP 时,我会得到如下信息:

ReportYearCmd CosCountCmd FranchiseCountCmd  ProductCountCmd

NULL          SELECT DISTINCT [Country Code] AS [COS - Country Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [COS] WHERE [COS].[Country Code] = [Fact].[Country Code] )        NULL               SELECT DISTINCT [Style Code] AS [Product - Style Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Product] WHERE [Product].[Style Code] = [Fact].[Style Code] ) 

我想返回实际结果,即如果 Cmd 不是 NULL,如上例,返回 CosCountCmd 和 ProductCountCmd 数据:

COS - Country Code     Product - Style Code 
reject1         Rejectxy
reject2         Reject1234
NULL            Reject567

我遵循了一些示例 here,但它们似乎都不适合我...

【问题讨论】:

  • 临时表在 SP 结束时超出范围...所以在您返回时它会消失。
  • @DaleK 哦...但是我有 GO 之后...应该有所作为吗?那我应该把它放在哪里
  • GO 是用于分隔语句的客户端命令。什么也不做。
  • 您要么必须创建一个 real 表来返回结果,要么在调用上下文中创建临时表,因为它可用于任何被调用的 SP。
  • 在调用您的 SP 之前创建它。

标签: sql-server


【解决方案1】:

Local temporary tables are visible only in the current session。因此:

在存储过程中创建的本地临时表会在存储过程完成后自动删除。

事实上,全局临时表(使用双数字符号定义,例如 ##temp)可能会满足您的需求:

当创建表的会话结束并且所有其他任务都停止引用它们时,将自动删除全局临时表。

否则,您可以在调用范围内定义临时表,即在调用 SP 或使用常规表之前。

【讨论】:

  • 谢谢。我也在这里找到了这个答案,显然额外的 # 有很大的不同? stackoverflow.com/a/9893172/8397835 所以##TEMP 意味着它更像是一张永久的桌子?
  • 那是一个全局临时表 - 在我链接到的参考资料中都有解释。事实上,这可能会满足您的需求。
猜你喜欢
  • 1970-01-01
  • 2014-11-30
  • 2020-06-13
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多