访问在过程外但在同一事务内的存储过程中创建的临时表

时间:2017-08-15 14:14:30

标签: sql-server tsql stored-procedures transactions temp-tables

我有一个事务调用存储过程来创建临时表。我需要能够在运行后访问存储过程之外的临时表。注意:对于我想要做的事情,我不能使用全局临时表。

示例:

以下是存储过程的示例:

CREATE PROCEDURE [dbo].[GetChangeID]()
AS
BEGIN
    IF OBJECT_ID('tempdb..#CurrentChangeID') IS NOT NULL
        DROP TABLE #CurrentChangeID

    SELECT '00000000-0000-0000-0000-000000000000' AS ChangeID INTO @CurrentChangeID

END
GO

以下是交易的一个示例:

BEGIN TRANSACTION
DECLARE @changeID uniqueidentifier
EXEC dbo.GetChangeID

DECLARE @test uniqueidentifier
SET @test = (SELECT ChangeID FROM #CurrentChangeID)

COMMIT TRANSACTION
GO

问题是它找不到名为#CurrentChangeID的表。

如何在不将其声明为全局临时表(如## CurrentChangeID?

)的情况下将其显示在可以看到此表的位置

------ ------ UPDATE

因此,让我为我的问题提供更多背景信息,因为这只是一个简化的例子。所以我最终要做的是:1。开始事务2.调用生成GUID的存储过程3.然后在给定视图中更新具有触发器的行。 4.在该触发器内获取sp中生成的GUID。 5.承诺。

2 个答案:

答案 0 :(得分:1)

首先,您无法访问SP外部存储过程中定义的本地临时表。它将永远超出范围。

第二,你可能不需要临时表。在您的示例中:

SET @test = (SELECT ChangeID FROM #CurrentChangeID)

看起来你只想要一个值。

我建议使用输出参数。

CREATE PROCEDURE [dbo].[GetChangeID](
      @test UNIQUEIDENTIFIER OUTPUT
)
AS
BEGIN
     -- ...

    SET @test =  '00000000-0000-0000-0000-000000000000';

END;

并致电:

DECLARE @changeID uniqueidentifier
EXEC dbo.GetChangeID @chaneId OUTPUT;

SELECT @changeId;

答案 1 :(得分:0)

感谢lad2025和Dan Guzman的意见。我最初尝试这样做的方式肯定是不正确的。

然而,我确实找到了完成这项任务的方法。

修改后的存储过程:

CREATE PROCEDURE [dbo].[GetChangeID]()
AS
BEGIN
    DECLARE @ChangeID uniqueidentifier
    ...
    Code that generates the uniqueidentifier, @ChangeID.
    ...

    --This can be seen within the context of this batch.
    SET CONTEXT_INFO @ChangeID
END
GO

然后,在此交易中您想要访问changeID的任何地方,您只需使用以下查询:

SELECT CONTEXT_INFO as changeID
FROM sys.dm_exec_requests
WHERE session_id = @@SPID AND request_id = CURRENT_REQUEST_ID()