2016-06-19 8 views
1

にループに変数を使用します。は、どのように私はこのようないくつかの<code>varchar</code>変数を持つSQL Serverの

DECLARE @counter INT 
SET @counter = 1 

WHILE(@counter <= n) 
BEGIN 
    UPDATE [table] 
    SET [header] 
    WHERE data = [@var1-n] 

    SET @counter = @counter + 1 
END 
GO 

はどのようにする@ VAR1を作るために - @varnは[@ VAR1-n]は上のループを使用することができますか?

+2

コードを実行することはできません。 'Header'カラムの値を何に設定していますか?また、Sqlはセットベースの操作に最も適しています。ループは可能な限り避けるべきです。適切に回答できるように、質問を編集して[mcve]を作成してください。 –

答えて

0

最も単純と最も「リレーショナル」の方法は、あなたがリレーショナルデータベースで利用可能なツールを使用することであろう。

テーブルに新しい値を入力して(テーブル変数にすることもできます)、基本テーブルをの単一のセットベースのステートメントで更新します。

このような何か:あなたの質問で

-- declare the table to hold the keys and new values 
DECLARE @NewValues TABLE (Data VARCHAR(20), NewHeader VARCHAR(50)) 

-- insert new data into this table variable instead of having n separate variables 
INSERT INTO @NewValues (Data, NewHeader) 
VALUES ('data a', 'New Header a'), ('data b', 'New Header b'), 
     ....., ('data n', 'New Header n'); 

-- update your base table in a SINGLE set-based statement 
UPDATE dbo.YourBaseTable 
SET Header = nv.NewHeader 
FROM @NewValues nv 
WHERE dbo.YourBaseTable.Data = nv.Data 

一つの素敵な簡単な文で、@NewValuesテーブル変数に任意の数の行を処理することができます.....

+1

私はそれが私が必要とするものだと思います。 私はそれを試して、それは働いた。どうもありがとう。 –

0

変数を動的に選択するためのネイティブに滑らかな方法はありません。あなたは、いくつかの醜いケースのステートメント、動的SQLなどを思い付く必要がありますが、おそらく最もエレガントな方法は、テーブル内の変数をキャッシュすることです、そして、あなたはどのような繰り返しに基づいてデータを動的に選択できるだろう〜を求めている。また、おそらく、whileループを実行せずにセットベースの操作を行うことで、問題を解決する方法があります。 テーブル -

+0

"data 1" - "data n"をループに入力する他の方法はありますか? ありがとう! –

+0

もしあなたが本当にそれをやりたいのであれば、いくつかの動的SQLウィザードを使うことができますが、それは本当に嫌なことです。ループを使用せずにセットベースの操作を使用しないで書き込むようにしてください。 – Yobik

関連する問題