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



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

例:

下面是存储过程的示例:

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(的情况下到达可以看到此表的位置?

------更新------

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

首先,您无法访问存储过程之外的 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;

谢谢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

然后,在此事务中要访问更改 ID 的任何位置,只需使用以下查询:

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

最新更新