2012-03-28 14 views
0

私は一時テーブルに格納している結果セットを返すSelectSPを持っています。今はInsertSPという名前の別のSPを呼び出して、この一時テーブルの値をパラメータとして渡したいと思っています。 一時テーブルから値を選択してパラメータとして渡す方法

CREATE TABLE #tempTable 
(
    Field1 VARCHAR(255), 
    Field2 VARCHAR(255), 
    Field3 VARCHAR(255), 
    Field4 VARCHAR(255), 
    Field5 VARCHAR(255), 
    Field6 VARCHAR(255), 
    Field7 VARCHAR(255) 
     . 
     . 
     . 

) 

INSERT INTO #tempTable exec 
usp_SelectSP 'p1' ,'p2', 'p3' 

は、今私はもう一つのSPを実行し、そのSPのパラメータとしてフィールド1、フィールド2、TEMPTABLEのフィールド3を通過したい:ここ

は私がこれまで持っているコードです。

私はこれを行うための最善の方法は何この

usp_InsertSP 
    @param1 = Field1 
    @Param2 = Field2 
    @Param3 = Field3 

FROM #tempTable. 

のようなものを考えていましたか?

+0

:記事からSharing a Temp Table from the article listed above

をあなたは、単一の行のストアドプロシージャを呼び出そうとしているか、プロシージャを複数回、各行ごとに1回呼び出す必要がありますか?なぜ呼び出されたプロシージャは 'SELECT values FROM#temp'だけではありませんか?呼び出し先は、呼び出し元が作成した#temp表の可視性が必要です。 –

+0

複数回呼び出す必要があります – Asdfg

+0

InsertSPを変更することはできません。私はそれにパラメータを渡す。 – Asdfg

答えて

2

あなたが呼ばれるSPを変更できない場合は、最も簡単な方法は、おそらくカーソルを次のようになります。

DECLARE @f1 VARCHAR(255), @f2 VARCHAR(255) --, ... 

DECLARE c CURSOR 
    LOCAL STATIC READ_ONLY FORWARD_ONLY 
    FOR SELECT Field1, Field2 --, ... 
    FROM #tempTable; 

OPEN c; 

FETCH NEXT FROM c INTO @f1, @f2 --, ... 

WHILE @@FETCH_STATUS <> -1 
BEGIN 
    EXEC usp_InsertSP 
    @param1 = @f1, 
    @param2 = @f2 --, ... 

    FETCH NEXT FROM c INTO @f1, @f2 --, ... 
END 

CLOSE c; 
DEALLOCATE c; 

私は強くあなたが呼ばれる手順を変更するお勧めしますが。呼び出されたプロシージャを直接使用するように変更することができれば、この#tempテーブルのデータを処理する効率的な方法はほとんどありません。

EDIT

呼ばprocは、発信者が作成した#TEMP表を見ることができることを実証しています。

CREATE PROCEDURE dbo.proc1 
AS 
BEGIN 
    SET NOCOUNT ON; 

    CREATE TABLE #t1(a INT); 

    INSERT #t1 SELECT 1 UNION SELECT 2; 

    EXEC dbo.proc2; 

    DROP TABLE #t1; 
END 
GO 

CREATE PROCEDURE dbo.proc2 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT a FROM #t1; 
END 
GO 

EXEC dbo.proc1; 

結果:

a 
- 
1 
2 
+0

私はDBAにSPの変更を依頼することができます。 #tempTableが存在する場合、パラメータからデータを挿入しないという条件付き挿入を要求する必要がありますか? – Asdfg

+0

いいえ、彼らができるべきことは単純に 'INSERT dbo.table(col1、col2、...)です。SELECT field1、field2、... FROM #tempTable;' - 呼び出されたSPは#tempテーブルを見ることができる! –

+0

InsertSPが呼び出されている場所から他の場所があり、パラメータが渡されます。そして、私もそれがうまくいきたいです。 – Asdfg

1

JUST #TEMP表を共有!

あなたは親のストアドプロシージャで作成しHow to Share Data between Stored Procedures by Erland Sommarskog

すべて#TEMPテーブルを読み込むために必要なすべてのネストされたと呼ばれる手続きにアクセス可能な、以下を参照してくださいです

The method itself is as simple as this: 

CREATE PROCEDURE called_procedure @par1 int, 
            @par2 bit, 
            ... AS 
    ... 
    INSERT/UPDATE/DELETE #tmp 
go 
CREATE PROCEDURE caller AS 
    DECLARE ... 
    CREATE TABLE #mytemp (col1 int  NOT NULL, 
         col2 char(5) NULL, 
         ...) 
    ... 
    EXEC called_procedure @par1, @par2 ... 
    SELECT * FROM #mytemp 
go 
+0

これ。私の神これ。 –

関連する問題