Я использую драйверы sqlsrv ms для php, которые работают нормально (протестированы с обычными запросами), я также проверил его с запущенной хранимой процедурой для обновления данных таблицы, которая также работает, знаю, что я хочу использовать ее для запуска хранимой процедуры и Я хочу ответа, как это можно сделать?
$server = "...the server address..."; $options = array("UID"=>"...the username...","PWD"=>"...the password...", "Database" => "...the database..." ); $conn = sqlsrv_connect($server, $options); if ($conn === false) {die("<pre>".print_r(sqlsrv_errors(), true));} $tsql_callSP = "{call ...the stored proc...( ?, ?)}"; $params = array( array("...first value in...", SQLSRV_PARAM_IN), array("...second value in...", SQLSRV_PARAM_IN) ); $stmt3 = sqlsrv_query( $conn, $tsql_callSP, $params); if( $stmt3 === false ) { echo "Error in executing statement 3.\n"; die( print_r( sqlsrv_errors(), true)); } print_r( $stmt3); //attempting to print the return but all i get is Resource id #3 echo "test echo"; sqlsrv_free_stmt( $stmt3); sqlsrv_close( $conn);
Я знаю, что могу использовать выходной параметр, но я всегда получаю несколько значений из хранимой процедуры.
Предположим, что хранимая процедура возвращает содержимое одной таблицы с помощью одного оператора SELECT, использование его вывода должно быть таким же простым, как использование результата sqlsrv_query, как и любой другой запрос запроса выбора (т. Е. Использование sqlsrv_fetch_object / array на результат)! Таким образом, хранимая процедура может выглядеть примерно так:
CREATE STORED PROCEDURE test AS -- do some other stuff here -- ... SELECT * FROM test GO
И в вашем php:
// establish db connection, initialize // ... $sql = "{call test}" $result = sqlsrv_query($conn, $sql); while (sqlsrv_fetch_object($result)) { // do something with the data // ... }
Вам нужно вызвать sqlsrv_fetch()
и sqlsrv_get_field()
для получения данных из возвращаемого оператора.
Из примера кода в руководстве для sqlsrv_get_field :
$stmt = sqlsrv_query( $conn, $tsql); if( $stmt === false ) { echo "Error in statement preparation/execution.\n"; die( print_r( sqlsrv_errors(), true)); } /* Make the first row of the result set available for reading. */ if( sqlsrv_fetch( $stmt ) === false ) { echo "Error in retrieving row.\n"; die( print_r( sqlsrv_errors(), true)); } /* Note: Fields must be accessed in order. Get the first field of the row. Note that no return type is specified. Data will be returned as a string, the default for a field of type nvarchar.*/ $name = sqlsrv_get_field( $stmt, 0); echo "$name: ";
Кроме того, я не уверен, когда вы скажете, что вы получите несколько значений, означает ли вы, что в одной строке будет несколько полей (в этом случае вам нужно будет делать больше вызовов sqlsrv_get_field()
), более одной строки (в которой вам придется использовать цикл while с вызовом sqlsrv_fetch () в цикле) или более одного набора результатов (в этом случае вам понадобится цикл while с использованием sqlsrv_next_result () ).