【问题标题】:Not receiving result from stored procedure MSSQL DB using PHP未使用 PHP 从存储过程 MSSQL DB 接收结果
【发布时间】:2016-05-26 09:41:22
【问题描述】:

您好,我有一个问题,我没有收到来自存储过程的结果,我正在使用 php 和 mssql 数据库。

我可以在 sql server profiler 中看到查询,当我在 sql server 管理工具中运行该查询时,查询正常工作。

当我使用 php 查询时,我得到以下错误

Array ( [0] => Array ( [0] => IMSSP [SQLSTATE] => IMSSP [1] => -28 [code] => -28 [2] => The active result for the query contains no fields. [message] => The active result for the query contains no fields. ))

这是我的 php 代码 '如果 ($this->conn) {

        $session_id = "9999912C8D74";
        $patient_id = "9999912C8D74";
        $days = 7;

        $params = array (
                array (
                        $session_id,
                        SQLSRV_PARAM_IN 
                ),
                array (
                        $patient_id,
                        SQLSRV_PARAM_IN 
                ),
                array (
                        $days,
                        SQLSRV_PARAM_IN 
                ) 
        );

        $tsql_callSP = "exec dbo.STOREDPROCEDURECALL @SessId=?, @PatId=?, @days=?";

        $stmt3 = sqlsrv_query ( $this->conn, $tsql_callSP, $params );

        if ($stmt3 === false) 

        {
            echo "Error in executing statement 3.\n";

            die ( print_r ( sqlsrv_errors (), true ) );
        }

        if( sqlsrv_fetch( $stmt3 ) === false) 
        {
            die( print_r( sqlsrv_errors(), true));
        }

        $name = sqlsrv_get_field( $stmt3, 1);
        echo "$name: ";

        $comment = sqlsrv_get_field( $stmt3, 2);
        echo $comment;

        while ( $obj = sqlsrv_fetch_object ( $stmt3 ) ) {
            var_dump ( $obj );
            echo $obj->BGUM . "<br>";
        }
    }

我在 stackoverflow 上尝试了很多解决方案,但没有任何效果 :-(,任何建议都将不胜感激。谢谢。

【问题讨论】:

  • 你的 SP 应该返回什么?一个值还是表?
  • 您好,感谢您的回复,它应该返回一个表格

标签: php sql-server sql-server-2008 stored-procedures


【解决方案1】:

毕竟,答案是在 SP 中添加SET NOCOUNT ON;

删除这部分:

if( sqlsrv_fetch( $stmt3 ) === false) 
    {
        die( print_r( sqlsrv_errors(), true));
    }

    $name = sqlsrv_get_field( $stmt3, 1);
    echo "$name: ";

    $comment = sqlsrv_get_field( $stmt3, 2);
    echo $comment;

    while ( $obj = sqlsrv_fetch_object ( $stmt3 ) ) {
        var_dump ( $obj );
        echo $obj->BGUM . "<br>";
    }

sqlsrv_fetch_array 的帮助下像这样改变它(阅读here):

while ($obj = sqlsrv_fetch_array($stmt3, SQLSRV_FETCH_NUMERIC)) {
    echo $obj[0]." ".$obj[1]."<br>"; //I don't know how many columns your SP return
}

sqlsrv_free_stmt( $stmt3);

或者您可以使用列名获取:

while ($obj = sqlsrv_fetch_array($stmt3, SQLSRV_FETCH_ASSOC)) {
    echo $obj['name']." ".$obj['comment']."<br>"; 
}

sqlsrv_free_stmt( $stmt3);

【讨论】:

  • 仍然得到以下数组(1) { [0]=> 数组(6) { [0]=> string(5) "IMSSP" ["SQLSTATE"]=> string(5) " "IMSSP" [1]=> int(-28) ["code"]=> int(-28) [2]=> string(51) "查询的活动结果不包含任何字段。" ["message"]=> string(51) "查询的活动结果不包含任何字段。" } }
  • 取这个字符串exec dbo.STOREDPROCEDURECALL @SessId='9999912C8D74', @PatId='9999912C8D74', @days=7并在SSMS中执行。输出会是什么?
  • No change 很抱歉,没有表数据通过....错误与此有关 if (sqlsrv_fetch ( $stmt3 ) === false)
  • :) 试试?, ?, ?,你的SP开头有SET NOCOUNT ON;吗?
  • 我通过添加 set nocount on 使其工作。谢谢 gofr1 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多