• 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引擎外面),究竟是如何执行的呢?

    个人的研究心得:

    1. sql引擎仍是机械的一步一步执行,运行存储过程和直接运行sql语句的不同在于执行的上下文环境(变量、自动执行下一步指令)有所不同。所以,客户端必须是(1)等待每一步的执行,如果不需要客户端介入处理结果集;(2)处理结果集:展示or丢弃;(3)下达存储过程执行的中断命令:杀死会话or主动反应(处理结果集or丢弃结果集)
    2. 存储过程作为一个完整的代码单元,起最终会有一个执行的状态(return状态):(1)正常的或默认的return 0;(2)手工的return n;(3)执行异常终止,sql引擎抛出的错误代码
    3. 存储过程内的顺序很重要,因为每一步都要按处理流程执行和等待反馈。特别的select返回结果集,不同的客户端或编程接口行为会不同:sqlserver自己的查询分析器或企业管理器仅仅是客户端的一种,它的表现行为不代表其他客户端或编程接口也是同样

    存储过程返回多个结果集的问题:

    sqlserver自身的查询分析器很好的表现!!

    php对多个结果集进行处理:默认取得第一个结果集的句柄,其他的必须通过 odbc_next_result($resultset) 来遍历,而且必须要遍历!否则会出现错误严重的错误 “[Microsoft][ODBC SQL Server Driver]连接占线导致另一个 hstmt

    如果仅仅关心默认的第一个结果集,可以在程序后面加入来释放占用的连接资源

    while(odbc_next_result($rows)){;}
  • 相关阅读:
    浅谈Java两种并发类型——计算密集型与IO密集型
    设置线程池的大小
    Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecuto
    gitlab的简单操作
    GitHub vs GitLab:区别?
    前端小知识汇总
    花里胡哨的CSS集锦
    码云如何上传代码
    小程序自定义底部导航
    Vue实践过程中的几个问题
  • 原文地址:https://www.cnblogs.com/jinzhenshui/p/3200022.html
Copyright © 2020-2023  润新知