ASP调用含Update后Select的存储过程无返回结果问题求助
问题分析与解决方案
你遇到的这个问题其实很常见——当存储过程里包含UPDATE(或INSERT/DELETE)语句时,SQL Server默认会返回受影响的行数作为一个结果集,而ADO的Recordset默认会指向第一个返回的结果集(也就是这个行数结果),而不是你后面的SELECT查询结果。这就是为什么去掉UPDATE后ASP能拿到数据,有UPDATE时就不行的核心原因。
下面是具体的解决办法,按优先级推荐:
方法1:修改存储过程,添加SET NOCOUNT ON;
这是最直接的解决方案,在存储过程的开头加上SET NOCOUNT ON;,它会阻止SQL Server返回UPDATE/INSERT/DELETE操作的受影响行数,这样ADO就只会接收到你需要的SELECT结果集。
修改后的存储过程代码(同时修复一个关键bug):
ALTER PROCEDURE [dbo].[eacActionTender] @tid INT, @key CHAR(10), @login NVARCHAR(255), @approve BIT, @message NVARCHAR(2000) AS SET NOCOUNT ON; -- 添加这一行,阻止返回受影响行数 BEGIN IF(@approve = 1) BEGIN UPDATE t_MiniTender SET Sent = 1 WHERE [ID] = @tid END -- 注意:这里修复了NULL判断的错误,SQL中必须用IS NULL而不是=NULL UPDATE t_ActionTender SET auth_login = @login, auth_decision = @approve, auth_text = @message, auth_date = GETDATE() WHERE tid = @tid AND keygen = @key AND auth_decision IS NULL SELECT Status = 'OK', viewNewMiniTender.*, t_ActionTender.SentTo AS ActionSentTo, t_ActionTender.auth_decision, t_ActionTender.auth_text, t_ActionTender.auth_date FROM t_ActionTender INNER JOIN viewNewMiniTender ON t_ActionTender.tid = viewNewMiniTender.[ID] WHERE t_ActionTender.tid = @tid AND keygen = @key END
这里额外提醒:你的UPDATE语句里auth_decision = NULL是语法错误,SQL里判断NULL必须用IS NULL,否则这个UPDATE永远不会执行,这也是需要立即修复的问题。
方法2:不修改存储过程,在ASP中切换到正确的结果集
如果因为某些原因不能修改存储过程,你可以在ASP代码里调用NextRecordset()方法,跳过UPDATE返回的行数结果集,切换到后面的SELECT结果集:
修改后的ASP代码:
<% 'On error resume next Session.LCID=2057 MM_etdocs_STRING = "Provider=SQLOLEDB.1;Persist Security Info=False;Data Source=MSSQL03\Websys;Initial Catalog=Projects;User ID=*****;Password=****;" Set rsnew = Server.CreateObject("ADODB.Recordset") rsnew.ActiveConnection = MM_etdocs_STRING rsnew.Source="EXEC eacActionTender 7003,'ZlBhH0APGg','EAC\USER',1,'d'" rsnew.CursorType = 0 rsnew.CursorLocation = 2 rsnew.LockType = 1 rsnew.Open() ' 跳过第一个结果集(UPDATE的受影响行数),切换到SELECT的结果集 Set rsnew = rsnew.NextRecordset() if not rsnew.EOF then response.write rsnew("Status") 'response.write rsnew("auth_decision") flds = rsnew.Fields.Count response.write("<div><br>" & flds & "<br></div>") end if %>
这样就能正确获取到SELECT语句返回的结果了。
额外检查点
- 先在SSMS里手动执行
EXEC eacActionTender 7003,'ZlBhH0APGg','EAC\USER',1,'d',确认SELECT语句确实有返回结果 - 虽然你提到权限已经很高,但可以再确认下执行存储过程的用户拥有
EXECUTE权限,以及对关联的表和视图有读取权限
内容的提问来源于stack exchange,提问作者kil lie
相关产品推荐
相关产品推荐

