PHP и хранимые процедуры в MSSQL

Timoshka

Guest
PHP и хранимые процедуры в MSSQL

Здравствуйте, подскажите, как решить проблему, уже голову на этом поломал.

Есть код:
PHP:
$s = @mssql_connect($myServer, $myUser, $myPass) 
or die("Couldn't connect to SQL Server on $myServer");
$d = @mssql_select_db($myDB, $s) 
or die("Couldn't open database $myDB");

$retval = 0;
$stmn = mssql_init("sp_test", $s);
mssql_bind($stmn, "RETVAL", &$retval, SQLINT2);
$res = mssql_execute($stml);

echo 'Return value: '.$retval;
Проблема в правильном получении RETVAL. Этот код правильно работает только в случае, если ХП не возвращает никаких наборов данных (result set), входные и выходные параметры могут быть.

К примеру:
PHP:
CREATE PROC sp_test 
AS
RETURN 10;
Но если result set есть, типа:
PHP:
CREATE PROC sp_test 
AS
select GetDate();
RETURN 10;
то RETVAL будет пустой.
Поискав немного в инете решения проблемы, я выяснил, что RETVAL всегда находится в последнем рекодсете, до которого можно добраться с использованием конструкции вида:
PHP:
while (mssql_next_result($res));
Действительно, если вставить эту строку перед выводом RETVAL, то все вроде бы работает. Но(!): после этой строки становятся недоступными данные из предыдущих рекодсетов.

Задача, которую я не могу решить. Моя ХП всегда возвращает 0, если процедура отработала успешно, и >0 - с ошибкой (ошибка может быть не критичной). Необходимо написать функцию на PHP, которая бы обрабатывала ошибку и в случае RETVAL=0 возвращала record set (хотя бы первый), если он есть.

Если кто с этим сталкивался, подскажите или дайте линку, где почитать. Спасибо.
 

CT

Новичок
Данную проблему обходил по схеме 1 запрос - 1 рекордсет.
 

Timoshka

Guest
Автор оригинала: CT
Данную проблему обходил по схеме 1 запрос - 1 рекордсет.
У меня тоже все по такой же схеме устроено. Процедуры либо на выборку, либо на вставку/модификацию/удаление. Но: при insert/update/delete - рекодсетов реальных нету (но на самом деле 1 есть для RETVAL). И мой PHP код работает. А при select, рекодсета 2 (1 реальный и 1 для RETVAL). В этом случае, чтобы добраться до RETVAL надо mssql_next_result вызывать.
 

rsv

Новичок
Может быть это и не поможет и я не правильно понял проблему, но все же напишу
У меня была проблема с ХП, надо было возвращать таблицу и какая то хрень у меня не выходила с этим. В итоге воспользовался такой штукой как user defined functions

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

CREATE FUNCTION DocsByNum (@variable varchar(20))
RETURNS TABLE
AS
begin
if some_error_infunc_execution return (select 1234 as error_num)
else return (select * from good_result_set where num>variable)
end

PHP:
$sql="SELECT *
             FROM user_name.DocsByNum('405353') ";
$r=mssql_query($sql);
if (mssql_num_fields($r)==1)
  {
    здесь обрабатываем ошибку
 }
else
 {
  ...
 }
 
Сверху