2016-05-02 2 views
-1

1つのテーブルから値を取得し、2番目のテーブルに挿入するためのカーソルを作成しています。挿入されるエントリはわずか35です。しかし、私のカーソルは止まらない。 1分経っても止まらない。私は実行を停止する必要があります。 エラーを教えてください。私は、カーソル処理が遅いとは思わないが、他の貢献者が示唆したように、古いスタイルがあなたのselect文に参加SQL ServerのCURSORは停止しません

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER Procedure [dbo].[Insert_Details_In_CForm_From_Orders] 
as Begin 

    Declare @CF_B_ID [int], 
      @CF_Date [date], 
      @CF_Invoice_No [int], 
      @CF_Quantity [decimal](18, 2), 
      @CF_Amount [decimal](18, 2), 
      @CF_Tax [decimal](18, 2), 
      @CF_Total_Amount [decimal](18, 2), 
      @Financial_Year [nvarchar](25), 
      @Quater [int] 

    Select @Financial_Year = Financial_Year, 
      @Quater = Quater 
    From Company 

    --Select a.O_B_ID,a.O_B_LR_Datetime,a.O_B_Bill_No,a.Total_Quantity,a.Total_Duty_Plus,a.Total_CST,a.Total_CST_Plus From Orders a , C_Form b where a.CST_TF=1 AND a.O_B_Bill_No!=b.CF_Invoice_No 
    Declare @CFormCursor CURSOR 
    SET @CFormCursor = CURSOR FAST_FORWARD 
    FOR 
     Select a.O_B_ID as CF_B_ID, 
       a.O_B_LR_Datetime as CF_Date, 
       a.O_B_Bill_No as CF_Invoice_No, 
       a.Total_Quantity as CF_Quantity, 
       a.Total_Duty_Plus as CF_Amount, 
       a.Total_CST as CF_Tax, 
       a.Total_CST_Plus as CF_Total_Amount 
     From Orders a , C_Form b 
     where a.CST_TF = 1 
     AND a.O_B_Bill_No != b.CF_Invoice_No 

    OPEN @CFormCursor 
    FETCH NEXT FROM @CFormCursor 
    INTO @CF_B_ID ,@CF_Date ,@CF_Invoice_No ,@CF_Quantity ,@CF_Amount ,@CF_Tax ,@CF_Total_Amount 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     INSERT INTO [dbo].[C_Form] ([CF_B_ID],[CF_Date],[CF_Invoice_No],[CF_Quantity],[CF_Amount],[CF_Tax],[CF_Total_Amount],[Financial_Year],[Quater]) 
     VALUES(@CF_B_ID ,@CF_Date ,@CF_Invoice_No,@CF_Quantity,@CF_Amount,@CF_Tax,@CF_Total_Amount,@Financial_Year,@Quater) 
     FETCH NEXT FROM @CFormCursor 
     INTO @CF_B_ID ,@CF_Date ,@CF_Invoice_No ,@CF_Quantity ,@CF_Amount ,@CF_Tax ,@CF_Total_Amount 
    END 
    CLOSE @CFormCursor 
    DEALLOCATE @CFormCursor 
End 
+1

なぜカーソルが必要なのですか?なぜ単に 'insert ... select'を使わないのですか? –

+0

しかし、私は遅れてどこに遅れているのかを知っておくべきです – Shantnu

+0

また、アーロン・バートランドによるこの記事を読んでください:[習慣の悪い習慣:古いスタイルのジョインを使う](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08 /bad-habits-to-kick-using-old-style-joins.aspx) –

答えて

1

は、2つのテーブルのサイズに応じて、長い時間がかかる場合があります。変更してみてください

Select a.O_B_ID as CF_B_ID, 
       a.O_B_LR_Datetime as CF_Date, 
       a.O_B_Bill_No as CF_Invoice_No, 
       a.Total_Quantity as CF_Quantity, 
       a.Total_Duty_Plus as CF_Amount, 
       a.Total_CST as CF_Tax, 
       a.Total_CST_Plus as CF_Total_Amount 
     From Orders a 
     join C_Form b on a.O_B_Bill_No = b.CF_Invoice_No 
     where a.CST_TF = 1 
     AND b.CF_Invoice_No is null 
+0

この参加は質問の参加と同じではありません。 @ Zohar。 –

+0

私はそうすべきだとは思わない。元の選択は、C_Formに表示されないOrdersだけが興味があるように思えます。したがって、同等の結合は、ヌルテストによってC_formに現れないオーダとの等価です。 A!= joinは、元の問題と同じ問題を引き起こします。 –

+0

これはOPが決定するためのものです。私はちょうど事実を述べていた:-) –

関連する問題