web-dev-qa-db-ja.com

選択クエリ内でストアドプロシージャを実行する方法

SELECT col1,
       col2,
       col3,

EXEC GetAIntFromStoredProc(T.col1) AS col4
     FROM Tbl AS T
     WHERE (col2 = @parm) 

SQL Server 2008でこのSQLクエリを記述する方法は?

41
Joakim

@twoleggedhorseに感謝します。

これが解決策です。

  1. 最初に関数を作成しました

    CREATE FUNCTION GetAIntFromStoredProc(@parm Nvarchar(50)) RETURNS INTEGER
    
    AS
    BEGIN
       DECLARE @id INTEGER
    
       set @id= (select TOP(1) id From tbl where col=@parm)
    
       RETURN @id
    END
    
  2. 次に、選択クエリを実行します

    Select col1, col2, col3,
    GetAIntFromStoredProc(T.col1) As col4
    From Tbl as T
    Where col2=@parm
    
40
Joakim

関数は選択ループ内で簡単に呼び出すことができますが、挿入、更新、削除などを実行することはできません。これらはクエリ操作にのみ役立ちます。データを操作するには、ストアドプロシージャが必要です。

したがって、この質問に対する本当の答えは、「カーソル」を介してselectステートメントの結果を反復処理し、そのループ内からプロシージャを呼び出す必要があるということです。次に例を示します。

DECLARE @myId int;
DECLARE @myName nvarchar(60);
DECLARE myCursor CURSOR FORWARD_ONLY FOR
    SELECT Id, Name FROM SomeTable;
OPEN myCursor;
FETCH NEXT FROM myCursor INTO @myId, @myName;
WHILE @@FETCH_STATUS = 0 BEGIN
    EXECUTE dbo.myCustomProcedure @myId, @myName;
    FETCH NEXT FROM myCursor INTO @myId, @myName;
END;
CLOSE myCursor;
DEALLOCATE myCursor;

@@FETCH_STATUSは更新される標準変数であることに注意してください。ここでの残りのオブジェクト名はカスタムです。

29
BuvinJ

ストアドプロシージャでINSERTまたはUPDATEステートメントを実行していない限り、おそらくそれを関数にすることをお勧めします。

ストアドプロシージャは、外部プログラムによる実行、または一定の間隔での実行用です。

ここでの答えは、私ができる以上にそれを説明します:

SQL Serverの関数とストアドプロシージャ

4
bd33

Proc出力に一致する一時テーブルを作成して挿入できます。

CREATE TABLE #Temp (
    Col1 INT
)

INSERT INTO #Temp
    EXEC MyProc
0
Steve Olson