SQL存储过程的游标循环

时间:2015-08-19 13:55:32

标签: sql-server tsql stored-procedures cursor

我的存储过程中有以下代码。有时似乎执行语句不会对某些@ID值执行。有任何想法吗?如果EXEC语句在游标循环中花费很长时间会发生什么?换句话说,EXEC语句是同步还是异步?谢谢!

declare @ID int
declare cur CURSOR LOCAL for

    select ID
        from WQ 
    where  CONVERT(DATE, DEPLOY_DT) = CONVERT(DATE, GETDATE())
        AND STAGE_ID = 6

open cur

    fetch next from cur into @ID

    while @@FETCH_STATUS = 0 BEGIN

        exec uspUpdPublishByWQID @ID

        fetch next from cur into @ID
    END

close cur
deallocate cur

更新

谢谢汉斯。如果出现问题我会捕获异常并将其保存到数据库中。我今天看到以下错误:

  

System.Data.SqlClient.SqlException(0x80131904):超时已过期。该   在完成操作或之前经过的超时时间   服务器没有响应。 ---> System.ComponentModel.Win32Exception   (0x80004005):等待操作超时   System.Data.SqlClient.SqlConnection.OnError(SqlException异常,   Boolean breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1   completion,String methodName,Boolean sendToPipe,Int32 timeout,   布尔asyncWrite)at   System.Data.SqlClient.SqlCommand.ExecuteNonQuery()at   BCPublish.Publish.PublishTasks()   ClientConnectionId:10786fb0-c091-446f-ADCA-7f359131f731

只是想知道,如果有超时错误,为什么它适用于某些ID ???

2 个答案:

答案 0 :(得分:0)

  

有时,执行语句不会对某些@ID值执行。有什么想法吗?

尝试添加PRINT语句以调试正在使用的ID。 我还测试运行SELECT语句以查看应该使用哪些ID。

  

EXEC语句是同步还是异步?

EXEC语句始终是同步。 您的EXEC语句可能会启动,例如,可以异步运行的SQL代理作业,但这可能不是重点。

  

如果EXEC语句在游标循环中花费很长时间会发生什么?

你的光标需要更长时间才能运行......

答案 1 :(得分:0)

由于该过程在某些时候可以正常工作。查看以下领域的SQL Server性能:

  1. 索引碎片
  2. VLF
  3. I / O
  4. 请高级DBA跟踪进程并记录性能计数器。