2016-02-17 19 views
1

我從執行存儲過程(插入查詢)中獲取超時錯誤,它只能插入大記錄。我必須使用SQL Server 2008的當在300k以上插入記錄它的超時錯誤?

這是我的代碼,

for (int k = 0; k <= MaxItemCode; k += 100) 
{ 
Application.DoEvents(); 
string[] ParamValues = { Convert.ToString(Microsoft.VisualBasic.Conversion.Val(k)) , 
    Convert.ToString(Microsoft.VisualBasic.Conversion.Val(k + 100))}; 
    SqlClientUtility.ExecuteNonQuery("SPInsertItemMasterEntriesMMRP", destConn, ParamValues); 
ScreenRefresh(); 
} 

我從該行得到這個錯誤:

SqlClientUtility.ExecuteNonQuery("SPInsertItemMasterEntriesMMRP", destConn, ParamValues); 

這是SP

set dateformat dmy 
BEGIN TRANSACTION 
BEGIN--------------------------------------------------------------------------------------------------------------------- 



DECLARE ItemMasterCursor CURSOR FOR 
    SELECT Item_Code, Item_Name, Brand_Code, Cat_Code, Manufact_Code, Supplier_Code, Subject_Code, Publisher_Code, 
    Author_Code, Co_Aut1, Co_Aut2, Currency_Code_P, Currency_Code_S, Blurb, Section_Code, Department_Code, 
    Product_Code, Ref_Code, Description, Item_UOM, Repacking, Weight, Pieces, Item_ISBN, Item_Reorder_Level, 
    Item_Reorder_Qty, PhotoPath, Item_OpBal, Item_COpBal, Item_Bal, Item_CBal, Pur_Date, PurDate_OpBal, 
    PurDate_COpBal, PurDate_Bal, PurDate_CBal, Item_MRP, Pur_Disc, Pur_Rate, Pur_Tax, Landing_Cost, 
    Profit, VAT, CST, Sale_Rate, Sale_Disc, Item_OEM, Item_SNo, Color_Code, Item_Size_Code, Batch_No, 
    Expiry_Date, R1, R2, R3, R4, R5, Item_Status, Branch_Code, Product_Rate, Type_Code, Main_Item, PrintName,Ing_Arabic,Ing_English 
    FROM [Item Master Temp] where Item_code>[email protected] and Item_code<[email protected] 
OPEN ItemMasterCursor 
FETCH NEXT FROM ItemMasterCursor INTO 
    @Item_Code, @Item_Name, @Brand_Code, @Cat_Code, @Manufact_Code, @Supplier_Code, @Subject_Code, @Publisher_Code, 
    @Author_Code, @Co_Aut1, @Co_Aut2, @Currency_Code_P, @Currency_Code_S, @Blurb, @Section_Code, @Department_Code, 
    @Product_Code, @Ref_Code, @Description, @Item_UOM, @Repacking, @Weight, @Pieces, @Item_ISBN, @Item_Reorder_Level, 
    @Item_Reorder_Qty, @PhotoPath, @Item_OpBal, @Item_COpBal, @Item_Bal, @Item_CBal, @Pur_Date, @PurDate_OpBal, 
    @PurDate_COpBal, @PurDate_Bal, @PurDate_CBal, @Item_MRP, @Pur_Disc, @Pur_Rate, @Pur_Tax, @Landing_Cost, 
    @Profit, @VAT, @CST, @Sale_Rate, @Sale_Disc, @Item_OEM, @Item_SNo, @Color_Code, @Item_Size_Code, @Batch_No, 
    @Expiry_Date, @R1, @R2, @R3, @R4, @R5, @Item_Status, @Branch_Code, @Product_Rate, @Type_Code, @Main_Item, @PrintName,@IngArabic,@IngEnglish 

WHILE @@FETCH_STATUS = 0 
BEGIN 


    DECLARE @MultiMRP BIT 
    SET @MultiMRP = (Select ISNULL(Multiple_Mrp,0) from [Company]) 

    IF @MultiMRP = 0 
    BEGIN 
     IF NOT EXISTS(SELECT * FROM [Item Master] WHERE Branch_Code = @Branch_Code 
          and Item_Code = @Item_Code and Type_code= @Type_Code) 
     BEGIN 
      INSERT INTO [ITEM MASTER] 
       (Item_Code, Item_Name, Brand_Code, Cat_Code, Manufact_Code, Supplier_Code, Subject_Code, Publisher_Code, 
       Author_Code, Co_Aut1, Co_Aut2, Currency_Code_P, Currency_Code_S, Blurb, Section_Code, Department_Code, 
       Product_Code, Ref_Code, Description, Item_UOM, Repacking, Weight, Pieces, Item_ISBN, Item_Reorder_Level, 
       Item_Reorder_Qty, PhotoPath, Item_OpBal, Item_COpBal, Item_Bal, Item_CBal, Pur_Date, PurDate_OpBal, 
       PurDate_COpBal, PurDate_Bal, PurDate_CBal, Item_MRP, Pur_Disc, Pur_Rate, Pur_Tax, Landing_Cost, 
       Profit, VAT, CST, Sale_Rate, Sale_Disc, Item_OEM, Item_SNo, Color_Code, Item_Size_Code, Batch_No, 
       Expiry_Date, R1, R2, R3, R4, R5, Item_Status, Branch_Code, Product_Rate, Type_Code, Main_Item, PrintName, Transfer_flag, Ascend_flag,Ing_Arabic,Ing_English) 
      VALUES 
       (@Item_Code, @Item_Name, @Brand_Code, @Cat_Code, @Manufact_Code, @Supplier_Code, @Subject_Code, @Publisher_Code, 
       @Author_Code, @Co_Aut1, @Co_Aut2, @Currency_Code_P, @Currency_Code_S, @Blurb, @Section_Code, @Department_Code, 
       @Product_Code, @Ref_Code, @Description, @Item_UOM, @Repacking, @Weight, @Pieces, @Item_ISBN, @Item_Reorder_Level, 
       @Item_Reorder_Qty, @PhotoPath, @Item_OpBal, @Item_COpBal, @Item_Bal, @Item_CBal, @Pur_Date, @PurDate_OpBal, 
       @PurDate_COpBal, @PurDate_Bal, @PurDate_CBal, @Item_MRP, @Pur_Disc, @Pur_Rate, @Pur_Tax, @Landing_Cost, 
       @Profit, @VAT, @CST, @Sale_Rate, @Sale_Disc, @Item_OEM, @Item_SNo, @Color_Code, @Item_Size_Code, @Batch_No, 
       @Expiry_Date, @R1, @R2, @R3, @R4, @R5, @Item_Status, @Branch_Code, @Product_Rate, @Type_Code, @Main_Item, @PrintName,0,0,@IngArabic,@IngEnglish) 
     END 
    END 
    ELSE 
    BEGIN 
     IF NOT EXISTS(SELECT * FROM [Item Master] WHERE Branch_Code = @Branch_Code 
          and Item_Code = @Item_Code 
          and Item_MRP = @Item_MRP and Type_code= @Type_Code) 
     BEGIN 
      INSERT INTO [ITEM MASTER] 
       (Item_Code, Item_Name, Brand_Code, Cat_Code, Manufact_Code, Supplier_Code, Subject_Code, Publisher_Code, 
       Author_Code, Co_Aut1, Co_Aut2, Currency_Code_P, Currency_Code_S, Blurb, Section_Code, Department_Code, 
       Product_Code, Ref_Code, Description, Item_UOM, Repacking, Weight, Pieces, Item_ISBN, Item_Reorder_Level, 
       Item_Reorder_Qty, PhotoPath, Item_OpBal, Item_COpBal, Item_Bal, Item_CBal, Pur_Date, PurDate_OpBal, 
       PurDate_COpBal, PurDate_Bal, PurDate_CBal, Item_MRP, Pur_Disc, Pur_Rate, Pur_Tax, Landing_Cost, 
       Profit, VAT, CST, Sale_Rate, Sale_Disc, Item_OEM, Item_SNo, Color_Code, Item_Size_Code, Batch_No, 
       Expiry_Date, R1, R2, R3, R4, R5, Item_Status, Branch_Code, Product_Rate, Type_Code, Main_Item, PrintName, Transfer_flag, Ascend_flag,Ing_Arabic, Ing_English) 
      VALUES 
       (@Item_Code, @Item_Name, @Brand_Code, @Cat_Code, @Manufact_Code, @Supplier_Code, @Subject_Code, @Publisher_Code, 
       @Author_Code, @Co_Aut1, @Co_Aut2, @Currency_Code_P, @Currency_Code_S, @Blurb, @Section_Code, @Department_Code, 
       @Product_Code, @Ref_Code, @Description, @Item_UOM, @Repacking, @Weight, @Pieces, @Item_ISBN, @Item_Reorder_Level, 
       @Item_Reorder_Qty, @PhotoPath, @Item_OpBal, @Item_COpBal, @Item_Bal, @Item_CBal, @Pur_Date, @PurDate_OpBal, 
       @PurDate_COpBal, @PurDate_Bal, @PurDate_CBal, @Item_MRP, @Pur_Disc, @Pur_Rate, @Pur_Tax, @Landing_Cost, 
       @Profit, @VAT, @CST, @Sale_Rate, @Sale_Disc, @Item_OEM, @Item_SNo, @Color_Code, @Item_Size_Code, @Batch_No, 
       @Expiry_Date, @R1, @R2, @R3, @R4, @R5, @Item_Status, @Branch_Code, @Product_Rate, @Type_Code, @Main_Item, @PrintName,0,0, @IngArabic,@IngEnglish) 
     END 
    END 
    FETCH NEXT FROM ItemMasterCursor INTO 
     @Item_Code, @Item_Name, @Brand_Code, @Cat_Code, @Manufact_Code, @Supplier_Code, @Subject_Code, @Publisher_Code, 
     @Author_Code, @Co_Aut1, @Co_Aut2, @Currency_Code_P, @Currency_Code_S, @Blurb, @Section_Code, @Department_Code, 
     @Product_Code, @Ref_Code, @Description, @Item_UOM, @Repacking, @Weight, @Pieces, @Item_ISBN, @Item_Reorder_Level, 
     @Item_Reorder_Qty, @PhotoPath, @Item_OpBal, @Item_COpBal, @Item_Bal, @Item_CBal, @Pur_Date, @PurDate_OpBal, 
     @PurDate_COpBal, @PurDate_Bal, @PurDate_CBal, @Item_MRP, @Pur_Disc, @Pur_Rate, @Pur_Tax, @Landing_Cost, 
     @Profit, @VAT, @CST, @Sale_Rate, @Sale_Disc, @Item_OEM, @Item_SNo, @Color_Code, @Item_Size_Code, @Batch_No, 
     @Expiry_Date, @R1, @R2, @R3, @R4, @R5, @Item_Status, @Branch_Code, @Product_Rate, @Type_Code, @Main_Item, @PrintName, @IngArabic, @IngEnglish 

END 
CLOSE ItemMasterCursor 
DEALLOCATE ItemMasterCursor 
END--------------------------------------------------------------------------------------------------------------------- 

COMMIT TRANSACTION 
+0

顯示我們'SPUpdateItemMasterEntriesGodown' – ughai

+0

代碼現在我編輯我的問題 –

+0

增加你的'CommandTimeout' –

回答

1

你包含遊標是真正的罪魁禍首。

你不需要光標,你IF獨立光標

SET @MultiMRP = (Select ISNULL(Multiple_Mrp,0) from [Company]) 

的任何值只是做一個Insert INTO SELECT獲取的@MultiMRP後。

事情是這樣的..

:表現依舊主觀上的兩個表定義的索引。

INSERT INTO [ITEM MASTER] 
       (Item_Code, Item_Name, Brand_Code, Cat_Code, Manufact_Code, Supplier_Code, Subject_Code, Publisher_Code, 
       Author_Code, Co_Aut1, Co_Aut2, Currency_Code_P, Currency_Code_S, Blurb, Section_Code, Department_Code, 
       Product_Code, Ref_Code, Description, Item_UOM, Repacking, Weight, Pieces, Item_ISBN, Item_Reorder_Level, 
       Item_Reorder_Qty, PhotoPath, Item_OpBal, Item_COpBal, Item_Bal, Item_CBal, Pur_Date, PurDate_OpBal, 
       PurDate_COpBal, PurDate_Bal, PurDate_CBal, Item_MRP, Pur_Disc, Pur_Rate, Pur_Tax, Landing_Cost, 
       Profit, VAT, CST, Sale_Rate, Sale_Disc, Item_OEM, Item_SNo, Color_Code, Item_Size_Code, Batch_No, 
       Expiry_Date, R1, R2, R3, R4, R5, Item_Status, Branch_Code, Product_Rate, Type_Code, Main_Item, PrintName, Transfer_flag, Ascend_flag,Ing_Arabic, Ing_English) 

SELECT Item_Code, Item_Name, Brand_Code, Cat_Code, Manufact_Code, Supplier_Code, Subject_Code, Publisher_Code, 
    Author_Code, Co_Aut1, Co_Aut2, Currency_Code_P, Currency_Code_S, Blurb, Section_Code, Department_Code, 
    Product_Code, Ref_Code, Description, Item_UOM, Repacking, Weight, Pieces, Item_ISBN, Item_Reorder_Level, 
    Item_Reorder_Qty, PhotoPath, Item_OpBal, Item_COpBal, Item_Bal, Item_CBal, Pur_Date, PurDate_OpBal, 
    PurDate_COpBal, PurDate_Bal, PurDate_CBal, Item_MRP, Pur_Disc, Pur_Rate, Pur_Tax, Landing_Cost, 
    Profit, VAT, CST, Sale_Rate, Sale_Disc, Item_OEM, Item_SNo, Color_Code, Item_Size_Code, Batch_No, 
    Expiry_Date, R1, R2, R3, R4, R5, Item_Status, Branch_Code, Product_Rate, Type_Code, Main_Item, PrintName,Ing_Arabic,Ing_English 
    FROM [Item Master Temp] T  
    WHERE Item_code>[email protected] and Item_code<[email protected] 
    AND NOT EXISTS ( 
        SELECT 1 
        FROM [ITEM MASTER] IM 
        WHERE IM.Branch_Code = T.Branch_Code 
          AND IM.Item_Code = T.Item_Code 
          AND IM.Type_code= T.Type_Code 
          AND (@MultiMRP = 0 OR IM.Item_MRP = T.Item_MRP)) 
+0

很好的回答ughai,我有同樣的想法。沒用過光標,我們仍然得到直接的選擇。 – Ajay2707

+0

如何重寫這個SP,請重寫該SP –

1

增加超時並不能完全解決問題。你需要的是解決的根本原因是SP的表現不佳。

SP的緩慢是由於這樣的事實,它是做逐行處理通過使用CURSOR所證明的。你需要重寫你的SP在基於集合的方式。這裏有一種方法:

DECLARE @MultiMRP BIT 
SELECT @MultiMRP =ISNULL(Multiple_Mrp, 0) FROM [Company] 

IF @MultiMRP = 0 BEGIN 
    INSERT INTO [ITEM MASTER] (<column list>) 
    SELECT 
     <value list> 
    FROM [Item Master Temp] imt 
    WHERE 
     Item_code >= @MinItemCode 
     AND Item_code<[email protected] 
     AND NOT EXISTS(
      SELECT 1 
      FROM [Item Master] 
      WHERE 
       Branch_Code = imt.Branch_Code 
       AND Item_Code = imt.Item_Code 
       AND Type_code = imt.Type_Code 
     )  
END 
ELSE BEGIN 
    INSERT INTO [ITEM MASTER] (<column list>) 
    SELECT 
     <value list> 
    FROM [Item Master Temp] imt 
    WHERE 
     Item_code >= @MinItemCode 
     AND Item_code<[email protected] 
     AND NOT EXISTS(
      SELECT 1 
      FROM [Item Master] 
      WHERE 
       Branch_Code = imt.Branch_Code 
       AND Item_Code = imt.Item_Code 
       AND Type_code = imt.Type_Code 
       AND Item_MRP = imt.Item_MRP 
     ) 
END 
相關問題