You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:13:44