2

行のセットを返すSELECTステートメントがあります。

各行から、1つの列の値を取得し、それをストアドプロシージャに渡して、行のセット自体に提供する必要のある値を取得する必要があります。

例えば:

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

どんなアイデアでも大歓迎です。ありがとう。

PS JOINステートメントを使用することをお勧めすることはたくさんありますが、実行するストアドプロシージャは非常に複雑であるため、カーソルSQLステートメントを使用して結合するのは複雑すぎます。

4

2 に答える 2

3

何らかの理由で関数に変更できない場合:

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
于 2010-12-30T16:45:11.553 に答える
1

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

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

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

ストアドプロシージャの基本性や複雑さによっては、関数さえ必要ない場合もありますが、最初にコードを確認して伝える必要があります。

于 2010-12-30T15:42:42.367 に答える