【问题标题】:View the result set of a temporary table's data using SELECT within the stored procedure that creates the same temporary table?在创建相同临时表的存储过程中使用 SELECT 查看临时表数据的结果集?
【发布时间】:2020-04-16 23:30:15
【问题描述】:

我必须创建一个存储过程,将新的支付期(增加 7 天)添加到名为 #TempPayPeriod 的临时表中。此表包含来自PayPeriod 表的所有支付期数据。所以我创建了一个过程,将这些永久数据全部移动到这个临时表中,并向该临时表添加一个新的支付期。

我现在需要查看该临时表,以便将其与此数据进行比较并确保它匹配

在我的代码中,我在执行过程后立即写了SELECT * FROM #TempPayPeriod。我收到了Command run successfully,但没有结果集可以查看?

USE PR
GO

CREATE PROC spAddPay
            @StartDate smalldatetime = NULL,
            @EndDate smalldatetime = NULL
AS
DROP TABLE IF EXISTS #TempPayPeriod;

SELECT * INTO #TempPayPeriod FROM PayPeriod;

SET @StartDate = (SELECT MAX(PerFrom) FROM #TempPayPeriod);
SET @StartDate = DATEADD(day, 7, @StartDate);
SET @EndDate = (SELECT MAX(PerThru) FROM #TempPayPeriod);
SET @EndDate = DATEADD(day, 7, @EndDate);

BEGIN TRY
    INSERT #TempPayPeriod
    VALUES (@StartDate, @EndDate);
END TRY
BEGIN CATCH
    PRINT 'Record was not added';
    PRINT 'Error: ' + CONVERT(varchar, ERROR_NUMBER(),1) + ': ' + CONVERT(varchar, ERROR_MESSAGE(),1);
END CATCH

EXEC spAddPay;
SELECT * FROM #TempPayPeriod;
GO

【问题讨论】:

    标签: sql-server tsql stored-procedures


    【解决方案1】:

    一旦存储过程完成,您的临时表就会失去作用域。您需要在存储过程中移动 select 语句,或者使用双井号符号使临时表成为全局表。 ##TempPayPeriod

    选项 1 - 从存储过程中返回结果

    USE PR
    GO
    
    CREATE PROC spAddPay
                @StartDate smalldatetime = NULL,
                @EndDate smalldatetime = NULL
    AS
    BEGIN
        DROP TABLE IF EXISTS #TempPayPeriod;
    
        SELECT * INTO #TempPayPeriod FROM PayPeriod;
    
        SET @StartDate = (SELECT MAX(PerFrom) FROM #TempPayPeriod);
        SET @StartDate = DATEADD(day, 7, @StartDate);
        SET @EndDate = (SELECT MAX(PerThru) FROM #TempPayPeriod);
        SET @EndDate = DATEADD(day, 7, @EndDate);
    
        BEGIN TRY
            INSERT #TempPayPeriod
            VALUES (@StartDate, @EndDate);
        END TRY
        BEGIN CATCH
            PRINT 'Record was not added';
            PRINT 'Error: ' + CONVERT(varchar, ERROR_NUMBER(),1) + ': ' + CONVERT(varchar, ERROR_MESSAGE(),1);
        END CATCH
    
        SELECT * FROM #TempPayPeriod
    END
    
    GO
    
    EXEC spAddPay;
    
    GO
    

    选项 2 - 使用全局临时表

    USE PR
    GO
    
    CREATE PROC spAddPay
                @StartDate smalldatetime = NULL,
                @EndDate smalldatetime = NULL
    AS
    BEGIN
    DROP TABLE IF EXISTS ##TempPayPeriod;
    
    SELECT * INTO ##TempPayPeriod FROM PayPeriod;
    
    SET @StartDate = (SELECT MAX(PerFrom) FROM ##TempPayPeriod);
    SET @StartDate = DATEADD(day, 7, @StartDate);
    SET @EndDate = (SELECT MAX(PerThru) FROM ##TempPayPeriod);
    SET @EndDate = DATEADD(day, 7, @EndDate);
    
    BEGIN TRY
        INSERT ##TempPayPeriod
        VALUES (@StartDate, @EndDate);
    END TRY
    BEGIN CATCH
        PRINT 'Record was not added';
        PRINT 'Error: ' + CONVERT(varchar, ERROR_NUMBER(),1) + ': ' + CONVERT(varchar, ERROR_MESSAGE(),1);
    END CATCH
    END
    EXEC spAddPay;
    SELECT * FROM ##TempPayPeriod;
    GO
    

    【讨论】:

    • 所以如果我将它移到EXEC spAddPay 上方而不是下方,那么它应该可以正常工作吗?
    • 将它移到EXEC spAddPay 上方并不是真正的问题。更多的是将它添加到存储过程中。我将编辑我的答案以澄清
    • 因为我刚刚尝试过,但仍然没有得到结果集?
    • 我明白了,但是我认为程序在GO 之后结束了。
    • 对于存储过程,最好使用BEGINEND 标记来标记正文。您已经在调用它的代码之上定义了一个可重用的存储过程,但您似乎将其全部描述为一个脚本。 GO 关键字只是一个批处理分隔符。在一个存储过程中可以有多个GO 命令,这就是我建议使用BEGINEND 标记的原因。我想你可能会混合一些概念。如果您知道这一点,请原谅我,但无需定义存储过程即可编写和运行脚本。
    猜你喜欢
    • 2010-09-12
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多