2010-12-30 11 views
1

SELECTステートメントで一連の行を返します。Selectに値を含めるSQL Serverカーソル

各行から、列の値を取得し、それをストアドプロシージャに渡して、一連の行自体に必要な値を取得する必要があります。例えば

DECLARE @col1 int 
DECLARE @col2 int 
DECLARE @col3 varchar(20) 

DECLARE myCursor CURSOR FOR 
SELECT col1, col2, col3 
FROM table1 
WHERE.... 

OPEN myCursor 
FETCH NEXT FROM myCursor 
INTO @col1, @col2 

WHILE @@FETH_STATUS = 0 
BEGIN 
    SET @col3 = EXEC proc_GetCol3_Value @col1, @col2 

    FETCH NEXT FROM myCursor 
    INTO @col1, @col2 
END 

CLOSE myCursor 
DEALLOCATE myCursor 

次に、そのベースから、私は、元のカーソルに加え、カラム3の値となるように実行されるストアドプロシージャから取得された値によって検索として行を返すようにしたいです。

言って、SQLカーソルによって返された行は次のとおりです。

col1 col2 col3 
    1 5000 
    2 5000 
    3 2500 
    4 2000 

そして、私は必要なのすべての列がカーソルやストアドプロシージャを実行した後に供給されていると、結果セットがあるべきであるということである。

col1 col2 col3 
    1 5000 APPROVED 
    2 5000 REJECTED 
    3 2500 CANCELLED 
    4 2000 APPROVED 

アイデアを歓迎します。ありがとう。

P.S. JOIN文を使用するだけでは多くのアドバイスがありますが、実行されるストアドプロシージャは非常に複雑なので、カーソルSQL文との結合は複雑すぎます。

+0

が親切にタイトルを変更します。 – Batuta

答えて

1

proc_GetCol3_Valueストアドプロシージャを使用してロックされていない限り、使用しているカーソルを破棄し、ストアドプロシージャをユーザー定義関数にすることを強くお勧めします。

私は(パフォーマンスの問題のため)ユーザー定義関数のファンではありませんが、これはケースを使用する場合もあります。あなたは、ほとんどの場合、あなたのストアドプロシージャのコードは、ステータスを返すユーザー定義関数(私たちはfunc_GetCol3_Valueそれを呼ぶことにします)に移行することができ、そして今、あなたのクエリは、単純にすることができます:

SELECT col1, col2, func_GetCol3_Value(col1, col2) as col3 
FROM table1 

どのように基本的なまたは複雑なあなたに応じて、ストアドプロシージャは、関数を必要としない場合もありますが、コードを最初に確認する必要があります。

+0

良い答え - 私は同意する、このコードは、UDFを使用するよう求め... – Sparky

+0

ありがとうございます。私はSPを関数呼び出しに置き、SQL selectの中から関数を呼び出しました。 – Batuta

2

もしあなたが関数に変更することはできません何らかの理由:私はこの質問がどうあるべきか、タイトルの漠然とした考えを持っているので

DECLARE @col1 int 
DECLARE @col2 int 
DECLARE @col3 varchar(20) 
DECLARE @Output (col1 int, col2 int, col3 varchar (20)) 

DECLARE myCursor CURSOR FOR 
    SELECT col1, col2, col3 FROM table1 WHERE.... 
OPEN myCursor 
FETCH NEXT FROM myCursor INTO @col1, @col2 
WHILE @@FETH_STATUS = 0 
BEGIN 
    SET @col3 = EXEC proc_GetCol3_Value @col1, @col2 

    INSERT INTO @Output (col1, col2, col3) 
    VALUES @col1, @col2, @col3 

FETCH NEXT FROM myCursor INTO @col1, @col2 
END 
CLOSE myCursor 
DEALLOCATE myCursor 

SELECT col1, col2, col3 from @Output 
関連する問題