【问题标题】:Call SQL Server stored procedure with output parameter from PHP使用 PHP 的输出参数调用 SQL Server 存储过程
【发布时间】:2017-01-31 08:44:11
【问题描述】:

我正在尝试从 php 执行一个 sql server 存储过程。存储过程返回一个输出值。我希望 php 中的值显示在网页中。

除了输出值在 php 中返回 0 外,一切正常。但是该行被完美地插入。输出值显示为 0。我犯了错误的地方很生气。下面是我的php代码

require('db.php');   

    $billno = "REF0001";  
    $retsno = 0.0;  

    $sp_name = "{call testinsert( ?, ? )}";

    $params = array(   
                     array($billno, SQLSRV_PARAM_IN),  
                     array($retsno, SQLSRV_PARAM_OUT)  
                   );  

    /* Execute the query. */  
    $stmt3 = sqlsrv_query( $conn, $sp_name, $params);  
    if( $stmt3 === false )  
    {  
         echo "Error in executing statement 3.\n";  
         die( print_r( sqlsrv_errors(), true));  
    }  


    echo "Inserted Retuern Sno for ".$billno." is ". $retsno. ".";  

我的存储过程是

create procedure testinsert(@bill_no VARCHAR(20),@RetSno INT OUTPUT)
as
begin
    insert into testable values(@bill_no,GETDATE())
    set @RetSno = @@IDENTITY
    return
end

【问题讨论】:

  • 这些变量没有被修改,所以当你回显它们时,你会得到它们的初始值 (REF0001, 0,0)。您需要将更新的值分配给这些变量。还是我错过了什么?
  • 请尝试将@@IDENTITY替换为正常号码时得到正确响应。
  • 安迪我也试过了。我只是从存储过程中返回了一个模糊的值。它仍然返回 0。
  • @OfirBaruch 是对的,sqlsrv_query 只是使用您的 $params-Array 但不会覆盖其中的任何内容
  • 尝试修改你的存储过程并使用“sqlsrv_fetch_array($stmt3)”

标签: php sql-server


【解决方案1】:

也许你错过了滚动。 https://msdn.microsoft.com/en-us/library/hh487160(v=sql.105).aspx

$stmt3 = sqlsrv_query( $conn, $sp_name, $params, array( "Scrollable" => 'static'));

【讨论】:

    【解决方案2】:

    在使用 echo 之前,添加以下行以阅读下一行:

    sqlsrv_fetch($stmt3);
    

    然后你可以选择响应的第一个字段,这应该是你的参数,sqlsrv_get_field()

    $id = sqlsrv_get_field(0);
    

    【讨论】:

      【解决方案3】:

      我有同样的情况,并使用以下方法解决了它:

      sqlsrv_next_result($stmt);

      在指令的末尾。在这里我放了我的部分代码,以防它帮助你。

      
      
          $totalPaginas = 0;
          $result = array();
          $query = "EXEC DBO.SPS_EJECUTAR_CONSULTA @ReporteID = ?, @FilasPorPagina = ?, @NroPagina = ?, @TotalPaginas = ?";
          $params = array(
              array(&$reporteid, SQLSRV_PARAM_IN),
              array(&$filasPorPagina, SQLSRV_PARAM_IN),
              array(&$nroPagina, SQLSRV_PARAM_IN),
              array(&$totalPaginas, SQLSRV_PARAM_OUT)
          );
          $stmt = sqlsrv_prepare($this->db, $query, $params);
          if( !$stmt ) {
              // show errors
          }
          $result = sqlsrv_execute($stmt);
          if( !$result ) {
              // show errors
          }
          $data = array();
          while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
              $data[] = $row;
          }
          sqlsrv_next_result($stmt);
          var_dum($data);
          echo('Total Paginas: '.$totalPaginas);
      
      

      这里官方告诉你怎么做: https://docs.microsoft.com/en-us/sql/connect/php/how-to-retrieve-input-and-output-parameters-using-the-sqlsrv-driver

      【讨论】:

        猜你喜欢
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        相关资源
        最近更新 更多