我的存储过程中有以下代码。有时似乎执行语句不会对某些@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 ???
答案 0 :(得分:0)
有时,执行语句不会对某些@ID值执行。有什么想法吗?
尝试添加PRINT语句以调试正在使用的ID。 我还测试运行SELECT语句以查看应该使用哪些ID。
EXEC语句是同步还是异步?
EXEC语句始终是同步。 您的EXEC语句可能会启动,例如,可以异步运行的SQL代理作业,但这可能不是重点。
如果EXEC语句在游标循环中花费很长时间会发生什么?
你的光标需要更长时间才能运行......
答案 1 :(得分:0)
由于该过程在某些时候可以正常工作。查看以下领域的SQL Server性能:
请高级DBA跟踪进程并记录性能计数器。