2012-02-15 12 views
1

SELECTの各行に対してストアドプロシージャを実行することは可能ですか?これは、すべての行に対して実行するために何かを探して、最初の行を実行します。SELECTステートメントの各行に対してOUTPUTを使用してストアドプロシージャを実行

Declare 
     @Loop bit = 1, @ID int, @Exists bit, @ReturnValue bit = 0 

    WHILE (@Loop) = 1 
     BEGIN 

      SELECT @ID = ID FROM Table --Multiple Rows Returned 

      EXEC [dbo].[StoredProc1] --Exec SP for Each Row 
       @InputID = @ID 
       ,@Exists = @Exists OUTPUT 

      IF @Exists = 1 
       BEGIN 
        SET @Loop = 0 
        SET @ReturnValue = 1 
       END 

     END 

    SELECT @ReturnValue [ReturnValue] 

答えて

5

は、カーソルを使用します。

DECLARE @exists  bit 
DECLARE db_cursor CURSOR FOR 
SELECT ID 
FROM Table 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @ID 

WHILE @@FETCH_STATUS = 0 
BEGIN 
     EXEC [dbo].[StoredProc1] --Exec SP for Each Row 
      @ID 
      , @exists OUTPUT 

     FETCH NEXT FROM db_cursor INTO @id 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 
+0

はこれを吸収するために少しかかりますが、それは動作します、ありがとう! –

+0

LOCAL STATIC READ_ONLY FORWARD_ONLYをカーソル宣言に追加することを強くお勧めします。 –

+0

@AaronBertrand:もしあなたがそのようなブードゥーの束を推薦しようとするならば、理由を指定する必要があります。さもなければ、それは貨物カルトプログラミングを奨励します。私は 'STATIC'カーソルに' READ_ONLY FORWARD_ONLY'を指定するのはどうしても気にしません。間違って使うと 'STATIC'を使うとかなりの悪影響を及ぼすことがあります。指定されたコードのように、カーソルが閉じられたときに割り当て解除されるカーソルに 'LOCAL'が必要なのでしょうか? – Gabe

関連する問題