2016-10-07 22 views
2

結果を返すCTEがあり、CTEの結果からストアドプロシージャを呼び出す必要があります。CTE(カーソルなし)のパラメータを使用してストアドプロシージャを呼び出す方法

;WITH MyCTE AS 
(
    SELECT arg1, arg2, arg3 FROM ATable 
) 
EXEC dbo.A_StoredProcedure 
    SELECT arg1 FROM MyCTE, 
    SELECT arg2 FROM MyCTE, 
    SELECT arg3 FROM MyCTE 

これは、EXECがCTEの直後に許可されたコマンドではないため、もちろん機能しません。 CURSORを使用してストアドプロシージャを呼び出して呼び出すことができますが、カーソルは「悪」なのでP:P; P; P; PIは疑問を抱いていました。カーソル?

カーソルが不可避な場合は、どうすればカーソルで実行できますか?

注:可能であれば、コードのメンテナンスを簡略化するために、ストアドプロシージャの内容をCTEにコピーしないことをお勧めします。

+0

を使用すると、表-Valuedパラメータのhttpsを試すことができる可能性があり、このhttp://stackoverflow.com/questions/14099913/pass-select-result-as-parameter-of-stored-procedure と思われるかもしれません。 microsoft.com/en-us/library/bb510489(SQL.100).aspx –

+0

あなたは間違いなくストアドプロシージャをそのように使用することはできません。おそらく、ストアドプロシージャは代わりに[テーブル値付き関数](https://msdn.microsoft.com/en-us/library/ms186755.aspx)になる可能性がありますか? – SMM

+0

はいテーブルの価値のあるパラメータは有望そうです。 – Rachel

答えて

1

私は検索を続けましたが、有効な回答がいくつか見つかりましたが、コメントして他の回答を追加してください。

回答1:この記事へ 感謝:Execute stored procedure programmatically inside recursive CTE instead of Cursor

一時テーブルを使用するには可能かもしれない、このような何か:

DECLARE #TempEmp TABLE 
(
    arg1 INT IDENTITY, 
    arg2 INT, 
    arg3 INT 
) 

INSERT INTO #TempTable 
(
    arg1, arg2, arg3 
) 
SELECT arg1, arg2, arg3 FROM ATable 

DECLARE @arg1 INT 
DECLARE @arg2 INT 
DECLARE @arg3 INT 

WHILE EXISTS (SELECT 1 FROM #TempTable) 
BEGIN 
    SELECT TOP 1 @arg1 = arg1, @arg2 = arg2, @arg3 = arg3 FROM #TempTable 
    EXEC dbo.A_StoredProcedure @arg1, @arg2, @arg3 

    DELETE FROM #TempTable WHERE arg1 = @arg1 
END 

回答2:この回答のため 感謝:Cursor with Stored Procedure Question

カーソルを使用している場合、それは次のようになります。

DECLARE @arg1 INT 
DECLARE @arg2 INT 
DECLARE @arg3 INT 

DECLARE cur CURSOR READ_ONLY 
FOR 
    SELECT arg1, arg2, arg3 FROM ATable 

OPEN cur 
FETCH NEXT FROM cur 
INTO @arg1, @arg2, @arg3 

-- Boucle dans le résultat 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    EXEC dbo.A_StoredProcedure @arg1, @arg2, @arg3 

    FETCH NEXT FROM cur 
    INTO @arg1, @arg2, @arg3 
END 

CLOSE cur 
DEALLOCATE cur 

は、他のアイデアを持っている人はいますか? // MSDN:

+0

セットベースのステートメントが最適であるときに、行セットごとに行操作を実行するとカーソルは「EVIL」になりますが、この場合、ストアード・プロシージャーは 'ATable'の行ごとに強制的に実行します。無視して、私はカーソルを使用することは分かりやすいことだと言います。 –

+0

Thanks @ EdwardComeau! – Rachel

関連する問題