0

私は一時テーブルをループしようとしましたが、役に立たず、非常に多くのエラーだけが発生しました。

どうすればこれを解決できるか教えてください..

私の必要性は次のようなものです:


  • テーブルから ID 列をフェッチし、それを 1 つの一時テーブルに格納する必要があります。
  • 次に、各 ID を反復処理し、その ID をパラメーターとして受け取るストアド プロシージャを実行します。
  • そのストアド プロシージャの戻り値 (= 1 列) を別のテーブルに挿入します。

これを行う方法を教えてください。

私はたくさん検索しました..カーソルとセットベースの結合と混同しました。

4

1 に答える 1

1

私見あなたの場合、一時テーブルは必要ありません。

次の 2 つのテーブルがあるとします。1 つはソース テーブルで、もう 1 つは宛先テーブルです。

CREATE TABLE mytable(id INT IDENTITY PRIMARY KEY, col1 nvarchar(10));
CREATE TABLE mytable2(id INT, value INT);

mytable次のサンプル データが含まれています。

id          col1
----------------
1           row1      
2           row2      
3           row3      
4           row4 

そして、このようなIDに基づいて何かを計算するSPがあります

CREATE PROCEDURE getValue (@id INT, @value INT OUT) 
AS
 SET NOCOUNT ON;
 SET @value = @id * 2;

次に、このような仕事をするSPを作成できます

CREATE PROCEDURE proccessData
AS
  SET NOCOUNT ON;
  DECLARE @id INT, @value INT;
  DECLARE id_cursor CURSOR FOR 
   SELECT id FROM mytable WHERE id > 1 AND id < 4;

  OPEN id_cursor;

  FETCH NEXT FROM id_cursor INTO @id;
  WHILE @@FETCH_STATUS = 0
  BEGIN
    EXEC getValue @id, @value OUTPUT;
    INSERT INTO mytable2 VALUES(@id, @value);
    -- Or use update if you already have id's in mytable2
    -- UPDATE mytable2 SET value = @value WHERE id = @id;
    FETCH NEXT FROM id_cursor INTO @id;
  END
  CLOSE id_cursor;
  DEALLOCATE id_cursor;

そのSPを呼び出した後

EXEC proccessData

あなたはmytable2に入るでしょう

id          value
----------- -----------
2           4
3           6

そして、ここでsqlfiddleが機能しています

于 2013-03-02T07:28:28.783 に答える