Не получен результат из хранимой процедуры MSSQL DB с использованием PHP

Привет, у меня проблема, когда я не получаю результат от хранимой процедуры, я использую базу данных php и mssql.

Я вижу запрос в профилировщике сервера sql, и когда я запускаю этот запрос в инструменте управления сервером sql, запрос работает правильно.

Когда я использую запрос с 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-код 'if ($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, ничего не сработало :-(, любое предложение будет с благодарностью принято. Спасибо.


person n4zg    schedule 26.05.2016    source источник
comment
Что должен вернуть ваш SP? Одно значение или таблица?   -  person gofr1    schedule 26.05.2016
comment
Привет, спасибо за ответ, он должен вернуть таблицу   -  person n4zg    schedule 26.05.2016


Ответы (1)


Ведь ответ был в добавлении SET NOCOUNT ON; в SP.

Удалите эту часть:

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 (про читайте здесь< /а>):

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);
person gofr1    schedule 26.05.2016
comment
все еще получаю следующий массив (1) { [0] => массив (6) { [0] => строка (5) IMSSP [SQLSTATE] => строка (5) IMSSP [1] => int (-28) [ code]=› int(-28) [2]=› string(51) Активный результат запроса не содержит полей. [message]=>string(51) Активный результат запроса не содержит полей. } } - person n4zg; 26.05.2016
comment
Затем возьмите эту строку exec dbo.STOREDPROCEDURECALL @SessId='9999912C8D74', @PatId='9999912C8D74', @days=7 и выполните в SSMS. Что будет на выходе? - person gofr1; 26.05.2016
comment
Без изменений, извините, данные таблицы не поступают.... ошибка связана с этим, если (sqlsrv_fetch ( $stmt3 ) === false) - person n4zg; 26.05.2016
comment
Просто изменил это на новое решение, оно ничего не возвращает (пустой экран), ошибок тоже нет. Я получаю пустой экран, я проверил код состояния http, и он равен 200. Так что проблем с кодом нет. - person n4zg; 26.05.2016
comment
А как насчет ССМС? вы пытались выполнить этот запрос напрямую? - person gofr1; 26.05.2016
comment
!! Просто поймите, что ваш массив параметров может быть проблемой... попробуйте так $params = array ($session_id, $patient_id, $days); - person gofr1; 26.05.2016
comment
я пробовал это раньше и снова только сейчас ... все еще без изменений, я просто сделал следующее var_dump (sqlsrv_fetch_array ($ stmt3, SQLSRV_FETCH_NUMERIC)); который вернул bool(false) - person n4zg; 26.05.2016
comment
Это запрос в SSMS, который возвращает правильные данные. P2 varchar(36),@P3 int','912C8D74','912C8D74',7 - person n4zg; 26.05.2016
comment
Странно, только что проверил, с SQLSRV_PARAM_IN и без все работает нормально. Ваш SP возвращает только один набор результатов? - person gofr1; 26.05.2016
comment
да, я только что проверил код с помощью простого запроса на выборку, и это тоже работает, поэтому я предполагаю, что проблема должна быть в запросе php SP - person n4zg; 26.05.2016
comment
Может @pattId? В вашем запросе один t в комментариях tt. Попробуйте удалить @SessId=?, @PatId=?, @days=? и добавить ?, ?, ? - person gofr1; 26.05.2016
comment
:) попробуйте с ?, ?, ? и у вас есть SET NOCOUNT ON; в начале вашего SP? - person gofr1; 26.05.2016
comment
изменено на $query = exec dbo.USP_Return_STOREDPROCEDURE ?, ?, ?; все еще не повезло - person n4zg; 26.05.2016
comment
должен ли я УСТАНОВИТЬ NOCOUNT ON, ? - person n4zg; 26.05.2016
comment
Это может помочь. Если нет - попробуйте выполнить запрос с помощью sp_executesql. у меня больше нет идей - person gofr1; 26.05.2016
comment
Я просто надел его и изменил запросы, но все равно не повезло .. большое спасибо за ваше время и усилия с благодарностью. если у вас есть какие-либо идеи позже, напишите нам комментарий. благодарю вас :-) - person n4zg; 26.05.2016
comment
Обязательно будет! Проверьте наличие опечаток в exec запросе, там тоже может быть проблема. - person gofr1; 26.05.2016
comment
Я заработал, добавив set nocount on. Спасибо gofr1 :-) - person n4zg; 26.05.2016
comment
Я просто написал комментарий, чтобы спросить, что это было :) Я добавлю это к своему ответу, чтобы другие могли использовать его, если им нужно :) Отлично! - person gofr1; 26.05.2016