2017-09-18 22 views
-1

私は2つのテーブルを持っています - 1つは#finalと呼ばれ、多くの顧客データ(すべての情報の複合)を持っています。これダースの列または - Iは、第2のテーブルループ内のMS SQLループ

create table #diff_temp 
(
customer_no int, 
num_reception int, 
num_guests int, 
diff int 
) 

第二テーブルは、顧客ID、総受信し、ゲストのチケットとdiff = reception-guests

間の差が移入されている方法を持っているfirst_name, middle_name, last_name, address, attendeesなど何私はループを実行して名前を挿入する必要がありますが、#finalにはレコードごとのdiffと等しい時間が入ります。

たとえば、

#diff_Tempのようなデータがあります。私が起こるに必要なもの

customer_no num_reception num_guests diff 
1   5    1   4 
2   12    10   2 
3   3    1   2 
4   32    20   12 
5   12    10   2 
6   8    6   2 

は、ループが4回を実行し、データを#finalに4回入力された顧客1のためのループが存在することです。顧客2の場合、ループは2回実行され、顧客4は12回実行されます。

各顧客について、ループはdiff列の値の量の時間を実行します。その後、ループは大規模なSQLクエリに基づいて#finalにデータを挿入します。

ここでカーソルやループを作成する方法を理解できないようです。


これは私が持っているスクリプトです。実行されますが、何もしません。 私は内部カーソルのみを実行すると、行(6)の量を取り、各行に6回入力します。私が望むものではありません。

新しく更新されたスクリプト:このコードは

(6 row(s) affected) 
iteration 1 
diff 4 
customer 1 

(6 row(s) affected) 
iteration 2 
diff 4 
customer 1 

(6 row(s) affected) 
iteration 3 
diff 4 
customer 1 

(6 row(s) affected) 
iteration 4 
diff 4 
customer 1 

(6 row(s) affected) 
iteration 1 
diff 2 
customer 2 

(6 row(s) affected) 
iteration 2 
diff 2 
customer 2 

以下の各反復/ループが6行を挿入されて生成される

DECLARE @Iteration INT = 1  -- Loop 
DECLARE @diff INT = 1   -- Cursor 
DECLARE @owner_customer_no INT -- Cursor 

BEGIN  
       DECLARE loop_cursor CURSOR FOR 
       SELECT owner_customer_no, diff 
       FROM #diff_temp 

       OPEN loop_cursor 
       FETCH NEXT FROM loop_cursor INTO @owner_customer_no, @diff 

       WHILE @@FETCH_STATUS = 0 
       BEGIN 

       SET @Iteration = 1 
       WHILE @Iteration <= @diff 
       BEGIN  
         insert into #final 
         select distinct 
         e.customer_no,       

         0 as guest_cust_no,     
         h.fname, 
         ... 
         where e.campaign_no = 1119 
         and sc.coding_scenario = 2 

       PRINT @Iteration 
       PRINT @diff 
       PRINT @owner_customer_no 

       SET @Iteration = @Iteration + 1 
       END 

       FETCH NEXT FROM loop_cursor INTO @owner_customer_no, @diff 
       END 

       CLOSE loop_cursor 
       DEALLOCATE loop_cursor 
END 

- 私はそれが何をしたいかは、1行を挿入しています。

+2

なぜあなたはそれを理解できないと思いますか?どのようなコードを試しましたか、どのようなエラーがありましたか? –

+0

@TabAlleman - 私は試してみましたが、私は立ち往生しています。私は質問にコードを追加しました。 – Elizabeth

+0

投稿されているものから、ここでループする必要はありません。これは、ループを回避できるデータを挿入するだけです。 –

答えて

0

変数@diffを宣言すると、その値はNULLになります。

DECLARE @diff INT, @owner_customer_no INT -- Cursor 

WHILE @Iteration <= @diff 

しかし @Iterationは「より小さいか等しい」NULL決してないので、WHILEループは実行されません:

次に、あなたはすぐにループ内でそれを使用してみてください。

編集:それは#diff_tempの行ごとに実行されるように、カーソルINSIDEに

WHILE @Iteration <= @diff 
BEGIN 
... 
SET @Iteration = @Iteration + 1 

END 

:実は、あなたはこのループを移動する必要があります。

EDIT 2:この行の後

、バック1に、内側のループは#diff_tempから次の行に正しく実行されるように

FETCH NEXT FROM loop_cursor INTO @owner_customer_no, @diff 
@Iteration

セット。

+0

@diffを1から開始するように更新しました。ループは今実行されていますが、不正確です。 – Elizabeth

+0

私の編集を参照してください。外側のループをカーソルの内側に置き、INSERTをその内部に置きます。 –

+0

私は変更を行った、その実行は非常に長い時間。私は何らかの無限ループにぶつかったと思う。 。 ... fetch_status = 0、begin、iteration <= diff、insert ....の間にカーソルを取得し、iteration = iteration + 1を設定してから次の値を取得します。 ...なぜそんなに長く走っているの? – Elizabeth