Извлечение данных, возвращаемых хранимой процедурой: Php & MS SQL SERVER - PullRequest
2 голосов
/ 28 июля 2011

Этот вопрос относится к:

PHP Версия 5.3.6

Драйверы Microsoft для PHP для SQL Server

Я пытаюсь правильно извлечь данные из хранимой процедуры.

Этот вопрос предполагает наличие следующей хранимой процедуры:

CREATE PROCEDURE test_procedure
AS
     BEGIN
           SET NOCOUNT ON
           --A bunch of SQL statements
           --More SQL statements
           SELECT 'Doctor Who Rules!'
     END

Я попробовал следующий код, который проходит через все мои команды, но не возвращает данные из окончательного SELECT.

$sql = "EXEC test_procedure;";
$result = sqlsrv_query($conn,$sql);
$next_result = sqlsrv_next_result($result); // returns a boolean
$row = sqlsrv_fetch_array($result);

Использование sqlsrv_execute также не работает с приведенным выше кодом.

Как я могу вернуть данные, сгенерированные хранимой процедурой выше, через PHP?

Спасибо.

Приложение № 1 (Классический аналог ASP)

sqlCMD = "EXEC test_procedure;"
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open _ConnectionString_Variable_
Set rs = conn.Execute(sqlCMD)

Я бы вернул набор записей с одной строкой, в которой есть одно поле с данными «Доктор Кто правил!»

Ответы [ 2 ]

1 голос
/ 07 июня 2012

Я только что столкнулся с той же проблемой несколько минут назад, и этот поток указал мне на рабочее решение (я не уверен, что это «правильное» решение, но оно работает).

На самом деле, проблема не была вызвана "SET NOCOUNT ON". В моем случае это была пара операторов PRINT, которые остались после отладки.

Похоже, что любой выход из SP, кроме фактического набора записей, вызывает проблему.

0 голосов
/ 28 июля 2011

Я выяснил проблему.

Код PHP в моем примере будет работать правильно, если в хранимой процедуре опущен SET NOCOUNT ONSET NOCOUNT ON в процедуре поток данных не возвращается обратно в PHP, и поэтому результаты последнего SELECT никогда не возвращаются.

Таким образом, эта хранимая процедура ...

CREATE PROCEDURE test_procedure
     @foo varchar(25)
AS
     BEGIN
          --A bunch of SQL statements
          --More SQL statements
          SELECT @foo
END

... будет отлично работать с этим PHP ...

$sql = "EXEC test_procedure 'Dr. Who Rules!';";
$result = sqlsrv_query($conn,$sql);
$next_result = sqlsrv_next_result($result);
$row = sqlsrv_fetch_array($result);

В результате вы получите набор записей со строкой «Доктор Кто правил!»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...