代码之家  ›  专栏  ›  技术社区  ›  Jared Benedict

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

  •  0
  • Jared Benedict  · 技术社区  · 8 年前

    例子:

    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的表。

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

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

    2 回复  |  直到 8 年前
        1
  •  2
  •   Lukasz Szozda    8 年前

    首先,您无法访问存储过程外部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;
    
        2
  •  0
  •   Jared Benedict    8 年前

    修改的存储过程:

    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
    

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