Sqlserver2005:深入了解php执行sqlserver存储过程procedure:odbc_exe、odbc_execute
以下存储过程(伪代码):
-- 伪代码,假设相关操作是成功的 alter procedure pr_test as begin set nocount on update tab set col='newvalue' --update操作 select * from tab --select查询,返回结果集 exec pr_test_2 --exec执行存储过程,一系列的操作,可能返回结果集 insert into tab --insert操作 select * from temp select * from temp --select查询2,返回结果集 delete * from temp --delete操作 end go
站在sqlserver客户端的角度 (sql引擎外面),究竟是如何执行的呢?
个人的研究心得:
- sql引擎仍是机械的一步一步执行,运行存储过程和直接运行sql语句的不同在于执行的上下文环境(变量、自动执行下一步指令)有所不同。所以,客户端必须是(1)等待每一步的执行,如果不需要客户端介入处理结果集;(2)处理结果集:展示or丢弃;(3)下达存储过程执行的中断命令:杀死会话or主动反应(处理结果集or丢弃结果集)
- 存储过程作为一个完整的代码单元,起最终会有一个执行的状态(return状态):(1)正常的或默认的return 0;(2)手工的return n;(3)执行异常终止,sql引擎抛出的错误代码
- 存储过程内的顺序很重要,因为每一步都要按处理流程执行和等待反馈。特别的select返回结果集,不同的客户端或编程接口行为会不同:sqlserver自己的查询分析器或企业管理器仅仅是客户端的一种,它的表现行为不代表其他客户端或编程接口也是同样
存储过程返回多个结果集的问题:
sqlserver自身的查询分析器很好的表现!!
php对多个结果集进行处理:默认取得第一个结果集的句柄,其他的必须通过 odbc_next_result($resultset) 来遍历,而且必须要遍历!否则会出现错误严重的错误 “[Microsoft][ODBC SQL Server Driver]连接占线导致另一个 hstmt”
如果仅仅关心默认的第一个结果集,可以在程序后面加入来释放占用的连接资源
while(odbc_next_result($rows)){;}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)