【问题标题】:EXEC statement in SQL stored procedure's cursor loopSQL 存储过程的游标循环中的 EXEC 语句
【发布时间】:2015-08-19 13:55:31
【问题描述】:

我的存储过程中有以下代码。有时,对于某些 @ID 值,execute 语句似乎不会执行。有任何想法吗?如果 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 异常, 布尔中断连接,动作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(TaskCompletionSource1 完成,字符串方法名,布尔型 sendToPipe,Int32 超时, 布尔 asyncWrite) 在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 在 BCPublish.Publish.PublishTasks() ClientConnectionId:10786fb0-c091-446f-adca-7f359131f731

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

【问题讨论】:

  • 如果您可以描述您想要做什么或发布uspUpdPublishByWQID 的代码,我们可以帮助您摆脱CURSOR。
  • 编辑您的存储过程并以PRINT @id 或类似名称开始它。我敢打赌你会发现它在你的光标中每行执行一次。
  • 它会打印所有的 ID 值。如果耗时较长,控制流是否会跳过 EXEC 语句?
  • Felix,我继承了这段代码,目前无法更改。

标签: sql-server tsql stored-procedures cursor


【解决方案1】:

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

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

EXEC 语句是同步的还是异步的?

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

如果 EXEC 语句在游标循环中花费很长时间会怎样?

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

【讨论】:

    【解决方案2】:

    由于该过程在某些时候有效,因此代码可以正常工作。查看 SQL 服务器在以下领域的性能:

    1. 索引碎片
    2. 甚低频
    3. I/O

    请高级 DBA 跟踪流程并记录性能计数器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      相关资源
      最近更新 更多