1,先把excel中的数据传送到server上。
2,再把此excel表格中的数据写到数据库的一张临时表中。
3,再根据某些条件把此张临时表的数据分别插入到n张表中。再拆分这张临时表的过程中,用了9个存储过程,就是存储过程调用存储过程。其中里面还有嵌套的游标,效率极低下。经常会发生timeout的事情。我直接在服务器上执行这些存储过程,查询分析器的时间是300秒,执行是成功的。如果在程序中调用存储就是会发生超时(timeout)是否有什么方式来控制连接超时或者有什么异步方式,就是提交了以后,控制权就交给sql server了,大家帮忙看看?谢谢!

解决方案 »

  1.   

    1最根本的解决方法是查出慢的原因,并排除
    2不知道你通过什么连接sql server的,如果ado或者ado.net,都是有选项设置超时时间的,
        CON.CommandTimeout       命令超时时间,你需要的估计是这个,秒为单位,你可以设置成500或者更大
        CON.ConnectionTimeout    连接超时时间
      

  2.   

    <add key="SQLConnectionString" value="Server=127.0.0.1;Database=test;User ID=sa;Password=ddd;Connection Timeout=1000;" />我设置了超时,还是不行的。需求:
    1,先把excel中的数据传送到server上。
    2,再把此excel表格中的数据写到数据库的一张临时表中。
    3,再根据某些条件把此张临时表的数据分别插入到n张表中。再拆分这张临时表的过程中,用了9个存储过程,就是存储过程调用存储过程。其中里面还有嵌套的游标,效率极低下。CREATE PROCEDURE  OnlineHanding  
       @UserName  NVARCHAR( 50 ),
       @ContractID              UNIQUEIDENTIFIER
    AS--BEGIN TRANSACTIONDECLARE   @ErrMessage         BIT
      
    -----第一步处理不合格数据
    EXEC OnlineCheckData @UserName ------更新  MST_AirlineId  和  FraeGoupID  ,RoutingI,以及检查和插入Routing和插入相关的表AirPortGroup,AirPortElement
    EXEC OnlineUpdateData @UserName, @ContractID ,@ErrMessage OUTPUTIF (@ErrMessage <> 0 )
    BEGIN
    -- Update the Restriction 根据DIR,RESIIN,RESIOUT,SPECIN,SPECOUT,SUBRES,RoutingID
    EXEC OnlineUpdateRes @UserName -----===================================
    DECLARE @TempID  UNIQUEIDENTIFIER
    DECLARE @BlackOutDateNo   NVARCHAR( 50 )
    DECLARE @WeekChargeNo  NVARCHAR( 50 )
    DECLARE @SeasonName  NVARCHAR( 50 )
    DECLARE @RoutingID  UNIQUEIDENTIFIER 
    DECLARE @AirlineID  UNIQUEIDENTIFIER 
    DECLARE @RestrictionNo NVARCHAR(50)
    DECLARE @DirectionRule NVARCHAR(100)
    DECLARE @FlightIn NVARCHAR(200)
    DECLARE @FlightOut NVARCHAR(200)
    DECLARE @SpecificIn NVARCHAR(200)
    DECLARE @SpecificOut NVARCHAR(200)
    DECLARE @SubRestrictionNo NVARCHAR(200)
    DECLARE @SEA                                 NVARCHAR(50)
    DECLARE @Class               NVARCHAR(50)
    DECLARE @FraeGoupID UNIQUEIDENTIFIER
    DECLARE @RTADT INT
    DECLARE @OWADT INT
    DECLARE @Resgroup INT  

    DECLARE FareCurcor  CURSOR
    FOR SELECT TempID, SEA, BLDAY, [DAY] , RoutingID, MST_AirlineId, RES, DIR,RESIIN,RESIOUT,SPECIN, SPECOUT, SUBRES,BKC,FraeGoupID,RTADT,OWADT,Resgroup
    FROM OnlineTempTable
    WHERE Operator = @UserName AND  Error <> 'N'
    ORDER BY CONVERT(INT,TempIndex) OPEN FareCurcor

    FETCH NEXT FROM FareCurcor 
    INTO @TempID,@SeasonName, @BlackOutDateNo, @WeekChargeNo, @RoutingID ,@AirlineID, @RestrictionNo,@DirectionRule ,
    @FlightIn , @FlightOut , @SpecificIn ,@SpecificOut ,@SubRestrictionNo ,@Class,@FraeGoupID,@RTADT,@OWADT,@Resgroup
    WHILE @@FETCH_STATUS = 0
    BEGIN
    ----检查和插入ROuting
    EXEC OnlineFare  @TempID,@ContractID,@BlackOutDateNo,
    @WeekChargeNo,@SeasonName, @RoutingID,@AirlineID, 
    @RestrictionNo,@DirectionRule,@FlightIn, @FlightOut, 
    @SpecificIn ,@SpecificOut ,@SubRestrictionNo ,@Class,
    @FraeGoupID,@RTADT,@OWADT,@Resgroup,@UserName FETCH NEXT FROM FareCurcor 
    INTO @TempID,@SeasonName , @BlackOutDateNo, @WeekChargeNo,
    @RoutingID ,@AirlineID , @RestrictionNo ,@DirectionRule ,@FlightIn ,
    @FlightOut , @SpecificIn ,@SpecificOut ,@SubRestrictionNo ,@Class,
    @FraeGoupID,@RTADT,@OWADT,@Resgroup
    END

    CLOSE FareCurcor
    DEALLOCATE FareCurcor --EXEC CommSortFlighRes @ContractID --DELETE  OnlineTempTable   WHERE Operator = @UserName END
    ELSE
    BEGIN
    SELECT  TempIndex, ErrMessage   FROM  OnlineTempTable   
    WHERE Operator = @UserName AND  isnull(Error,'') = 'N'  ORDER BY  convert(int,TempIndex ) 
    --DELETE  OnlineTempTable   WHERE Operator = @UserName
    END--IF @@ERROR = 0
      --  COMMIT TRANSACTION
    --ELSE  --  ROLLBACK TRANSACTIONDELETE  OnlineTempTable   WHERE Operator = @UserName
    GO
      

  3.   

    这些数据是不能分开处理的,因为数据插入表中是有key的限制。我们是在做一个合同的处理系统,用excel就是合同录入者,把合同的信息输入到excel中,再一次性导入到数据库中,这样就减少了合同录入者的工作量。看到了游标中执行的OnlineFare  这个存储吗,OnlineFare 还有嵌套游标呢?
    ----------------------------------------检查和插入ROuting
    EXEC OnlineFare  @TempID,@ContractID,@BlackOutDateNo,
    @WeekChargeNo,@SeasonName, @RoutingID,@AirlineID, 
    @RestrictionNo,@DirectionRule,@FlightIn, @FlightOut, 
    @SpecificIn ,@SpecificOut ,@SubRestrictionNo ,@Class,
    @FraeGoupID,@RTADT,@OWADT,@Resgroup,@UserName-------------------------------------大家再帮忙想想有其他的做法吗?
      

  4.   

    ----------------------------------------  
           因为asp.net的bs 机制 ,我们长期在执行一个比较复杂,超做时间比较长的存储过程的时候,页面超时,停止响应.使用这个方法可以通过sql 作业 实现程序的异步调用的临时Job/******************************************************************************
    * 在SQL SERVER 2000中创建用于执行异步调用的临时Job
    * @EXECSQL: Transact-SQL batch
    * Eample: EXEC dbo.AsynchronousInvoking @EXECSQL = 'UPDTAE customer SET balance = 0'
    * 缺点:该存储过程必须指定数据库的名字
    ******************************************************************************/
    CREATE Procedure bak
    @EXECSQL nvarchar(4000),
    @job nvarchar(50),
    @servern nvarchar(50),
    @dbname nvarchar(50)
    AS BEGIN TRANSACTION 
    DECLARE @JobID BINARY(16) 
    DECLARE @ReturnCode INT 
    SELECT @ReturnCode = 0 BEGIN -- Add the job
    EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT , 
    @job_name = @job, 
    @owner_login_name = N'', 
    @description = N'description for job', -- the description of the job 
    @category_name = N'[Uncategorized (Local)]',  
    @enabled = 1, 
    @notify_level_email = 0, 
    @notify_level_page = 0, 
    @notify_level_netsend = 0, 
    @notify_level_eventlog = 0, 
    @delete_level= 3IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -- Add the job steps
    EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, 
    @step_id = 1, 
    @step_name = N'step1', 
    @command = @EXECSQL, -- sql batch
    --缺点:该存储过程必须指定数据库的名字
    @database_name = @dbname, --the database name of the job to manipulate
    @server = N'', 
    @database_user_name = N'', 
    @subsystem = N'TSQL', 
    @cmdexec_success_code = 0, 
    @flags = 0, 
    @retry_attempts = 0, --execute once only
    @retry_interval = 0, 
    @output_file_name = N'', 
    @on_success_step_id = 0, 
    @on_success_action = 1, -- on success abort
    @on_fail_step_id = 0, 
    @on_fail_action = 2 -- on fail abortIF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback --set the star step id of the job
    EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID, 
    @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -- Add the Target Servers
    EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, 
    @server_name = @servern--传入的服务器名称IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback ENDCOMMIT TRANSACTION 
    GOTO EndSave QuitWithRollback:
    IF (@@TRANCOUNT > 0) BEGIN 
    ROLLBACK TRANSACTION 
    RETURN 1
    END
    EndSave: --star the job immediately
    EXEC @ReturnCode = msdb.dbo.sp_start_job @job_id = @JobID--return to the invoker immediately
    RETURN @ReturnCode
    GO
    ------------------------------------------
    这个是异步调用的代码,我看不懂,大家帮忙分析一下。我就是调用一个主的存储过程OnlineHanding ,在OnlineHanding 中调用其他的存储过程,按照这个我应该如何来改呢?