Выходные параметры хранимой процедуры SQL Server в PHP - PullRequest
6 голосов
/ 26 января 2009

Мне нужна помощь в запуске хранимой процедуры из SQL Server в PHP. PHP работает на сервере Unix / Linux. Мы не можем получить переменные OUTPUT для возврата в PHP. Ниже приведен код PHP:

$conn = mssql_connect('server', 'user', 'pass');
    mssql_select_db('db', $conn);

    $procedure = mssql_init('usp_StoredProc', $conn);

    $tmpVar1 = 'value';
    $tmpVar2 = 'value2';

    $outVar1 = '';
    $outVar2 = '';

    mssql_bind($procedure, "@var1", $tmpVar1, SQLVARCHAR, false, false);
    mssql_bind($procedure, "@var2", $tmpVar2, SQLVARCHAR, false, false);

    mssql_bind($procedure, "@outVar1", $outVar1, SQLVARCHAR, true);
    mssql_bind($procedure, "@outVar2", $outVar2, SQLVARCHAR, true);

    mssql_execute($procedure,$conn);

    print($outVar1);
    print($outVar2);

Хранимая процедура выглядит так:

    SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER proc [dbo].[usp_StoredProc]
(
    @var1 as varchar(36), 
    @var2 as varchar(10), 
    @outVar1 varchar(36) OUTPUT, 
    @outVar2 varchar(36) OUTPUT 
)
as
  select distinct 
    @outVar1 = row1, 
    @outVar2 = row2
  from table1
  where column1 = @var1
    and column2 = @var2

Может кто-нибудь сказать мне, почему $ outVar1 и $ outVar2 не заполнены? Большое спасибо за любую помощь!

Ответы [ 8 ]

3 голосов
/ 26 января 2009

Согласно этой странице об ошибках PHP , вы должны (выделение мое):

звоните mssql_next_result() за каждого набор результатов, возвращаемый SP. это способ обработки нескольких результатов.

Когда mssql_next_result() возвращает false у вас будет доступ к выводу параметры и возвращаемое значение.

2 голосов
/ 14 сентября 2009

Второй параметр execute должен быть истинным, а не conn. Это должно работать:

$conn = mssql_connect('server', 'user', 'pass');
mssql_select_db('db', $conn);

$procedure = mssql_init('usp_StoredProc', $conn);

$tmpVar1 = 'value';
$tmpVar2 = 'value2';

$outVar1 = '';
$outVar2 = '';

mssql_bind($procedure, "@var1", $tmpVar1, SQLVARCHAR, false, false);
mssql_bind($procedure, "@var2", $tmpVar2, SQLVARCHAR, false, false);

mssql_bind($procedure, "@outVar1", $outVar1, SQLVARCHAR, true);
mssql_bind($procedure, "@outVar2", $outVar2, SQLVARCHAR, true);

mssql_execute($procedure,true);

print($outVar1);
print($outVar2);
1 голос
/ 26 января 2009

Попробуйте указать конкретную длину выходных полей

mssql_bind($procedure, "@outVar1", &$outVar1, SQLVARCHAR, true, false, 36);
mssql_bind($procedure, "@outVar2", &$outVar2, SQLVARCHAR, true, false, 36);

И посмотри, имеет ли это значение.

Также обратите внимание на явное &, чтобы передать выходные переменные по ссылке, хотя я не знаю, требуется ли это по-прежнему или нет.

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

Я сделал это через библиотеку Adodb очень просто ...

$ addProduct = $ obj-> ExecuteQuery ("Begin; DECLARE @ProductCode as varchar (100); EXEC CREATEPRODUCT '$ pname', '$ price', @ProductCode OUTPUT, '$ merchantId'; select @ProductCode; End ; ");

$ productCode = $ addProduct [0] [0];

для более подробного объяснения вы можете посетить этот сайт .. http://developer99.blogspot.com/2011/07/calling-ms-sql-sp-from-php.html

0 голосов
/ 19 июля 2010

У меня такие же проблемы.

Предполагается, что вы используете драйвер FreeTDS для связи с SQL Server. Существует известная проблема с работой драйвера. Это выделено в FAQ

http://www.freetds.org/faq.html#ms.output.parameters

Документация по API для того, что предлагается в FAQ, здесь, но я не могу найти способ получить доступ к этому с помощью PHP:

http://www.freetds.org/reference/a00276.html

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

0 голосов
/ 26 января 2009

Hm. Несколько комментариев

1) "mssql_execute ($ method, $ conn);" неправильно в том, что 2-й параметр не является соединением.

2) Если вы получаете «сбой выполнения хранимой процедуры», мне пришлось создать хост БД в freetds.conf и сослаться на него.

В этот момент я не получаю ошибок, но также не получаю выходные параметры. Это PHP 5.1 на RHEL5.

Если я включаю ведение журнала freeTDS, я вижу, что данные возвращаются в ответном пакете. На данный момент, я не знаю, почему он тоже не работает (кроме того, что немного не хватает поддержки SQL для PHP!)

0 голосов
/ 26 января 2009

Не уверен, какую версию PHP вы используете, но я думаю, что в некоторых старых версиях вам нужно было передавать переменные по ссылке, чтобы получить значение, чтобы оно появилось снова:

Поэтому при вызове функции вам нужно поставить & charcter перед переменной:

mssql_bind($procedure, "@outVar1", &$outVar1, SQLVARCHAR, true);
mssql_bind($procedure, "@outVar2", &$outVar2, SQLVARCHAR, true);

Также согласно этой ссылке в некоторых версиях возникла проблема с выходными параметрами

0 голосов
/ 26 января 2009

Я сомневаюсь, что это вызывает вашу проблему, но почему вы используете DISTINCT?

Это просто кодовая ячейка - всякий раз, когда вы видите это, это означает, что существует вероятность возврата дубликатов, которые "обрабатываются" с помощью DISTINCT, и почему, вероятно, нужно возвращать дубликаты.

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