2017-08-15 28 views
0

一時テーブルを作成するストアドプロシージャを呼び出すトランザクションがあります。ストアドプロシージャが実行された後で、この一時テーブルにアクセスできるようにする必要があります。注:私がやろうとしていることについては、私はグローバルな一時テーブルを使用することはできません。ストアドプロシージャ内でストアドプロシージャ内に作成された、同じトランザクション内のプロシージャ外の

例:ここでは

は、ストアドプロシージャの例です。ここで

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.コミットする。

答えて

0

、あなたの入力をlad2025とダン・グスマンありがとうございました。私が元々これをやろうとしていた方法は、間違いなく間違っていました。

しかし、私はこの作業を達成する方法を見つけました。内に作成されたその一時テーブルを追加

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

まず、ストアドプロシージャ外のSPで定義されたローカル一時テーブルにアクセスすることはできません。それは常に範囲外です。

第2に、あなたは暫定的なテーブルを必要としません。あなたの例:

SET @test = (SELECT ChangeID FROM #CurrentChangeID) 

1つの値がほしいと思うようです。


出力パラメータを使用することを提案します。

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

:次にどこにchangeIDにアクセスしたいと思い、このトランザクション内で、あなただけの次のクエリを使用する必要が

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 

は、ストアド・プロシージャの変更しますprocが完了するとprocは自動的に削除されます。 –

+0

お返事ありがとうございます。それが私が恐れていたものです。それで、それは単なる単純な例だったので、私の質問にもっと文脈を与えましょう。だから私が最終的にやってみようとしているのは次のとおりです。 1.トランザクションの開始 2. GUIDを生成するストアドプロシージャを呼び出します 3.トリガーを持つビュー内の行を更新します。 4.そのトリガー内で、sp内で生成されたGUIDを取得します。 5.コミットします。 それは意味がありますか? –

関連する問題