【发布时间】: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