访问在过程外部但在同一事务中的存储过程中创建的临时 table
Accessing temp table created within a stored procedure outside of procedure but within same transaction
我有一个 t运行saction,它调用一个创建临时文件的存储过程 table。在 运行 之后,我需要能够在存储过程之外访问此临时 table。注意:对于我正在尝试做的事情,我不能使用全局温度 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
这是 t运行 动作的示例:
BEGIN TRANSACTION
DECLARE @changeID uniqueidentifier
EXEC dbo.GetChangeID
DECLARE @test uniqueidentifier
SET @test = (SELECT ChangeID FROM #CurrentChangeID)
COMMIT TRANSACTION
GO
问题是找不到名为#CurrentChangeID 的table。
如何在不将其声明为全局温度 table(例如 ##CurrentChangeID?
的情况下到达可以看到此 table 的位置
------更新------
所以让我为我的问题提供更多背景信息,因为这只是一个简化的示例。所以我最终想做的是: 1. 开始 T运行saction 2. 调用生成 GUID 的存储过程 3. 然后更新具有触发器的给定视图中的行。 4. 在该触发器中获取在 sp 中生成的 GUID。 5. 提交。
首先,您无法访问在 SP 外部存储过程中定义的本地临时文件 table。它总是超出范围。
其次,您可能甚至不需要温度 table。在你的例子中:
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
然后在此交易中任何您想访问 changeID 的地方,您只需使用以下查询:
SELECT CONTEXT_INFO as changeID
FROM sys.dm_exec_requests
WHERE session_id = @@SPID AND request_id = CURRENT_REQUEST_ID()
我有一个 t运行saction,它调用一个创建临时文件的存储过程 table。在 运行 之后,我需要能够在存储过程之外访问此临时 table。注意:对于我正在尝试做的事情,我不能使用全局温度 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
这是 t运行 动作的示例:
BEGIN TRANSACTION
DECLARE @changeID uniqueidentifier
EXEC dbo.GetChangeID
DECLARE @test uniqueidentifier
SET @test = (SELECT ChangeID FROM #CurrentChangeID)
COMMIT TRANSACTION
GO
问题是找不到名为#CurrentChangeID 的table。
如何在不将其声明为全局温度 table(例如 ##CurrentChangeID?
的情况下到达可以看到此 table 的位置------更新------
所以让我为我的问题提供更多背景信息,因为这只是一个简化的示例。所以我最终想做的是: 1. 开始 T运行saction 2. 调用生成 GUID 的存储过程 3. 然后更新具有触发器的给定视图中的行。 4. 在该触发器中获取在 sp 中生成的 GUID。 5. 提交。
首先,您无法访问在 SP 外部存储过程中定义的本地临时文件 table。它总是超出范围。
其次,您可能甚至不需要温度 table。在你的例子中:
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
然后在此交易中任何您想访问 changeID 的地方,您只需使用以下查询:
SELECT CONTEXT_INFO as changeID
FROM sys.dm_exec_requests
WHERE session_id = @@SPID AND request_id = CURRENT_REQUEST_ID()