PHP中的SQL Server存储过程输出参数

时间:2009-01-26 19:19:41

标签: php sql-server stored-procedures

我需要帮助从PHP中的SQL Server运行存储过程。 PHP在Unix / Linux服务器上运行。我们无法在PHP中返回OUTPUT变量。以下是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 个答案:

答案 0 :(得分:3)

根据this page on PHP bugs,你必须(强调我的):

  

为每个人致电mssql_next_result()   SP返回的结果集。这个   你可以处理多种结果的方式。

     

mssql_next_result()返回false时   您将有权访问输出   参数和返回值。

答案 1 :(得分:2)

执行的第二个参数需要是真的,而不是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);

答案 2 :(得分:1)

尝试指定输出字段的特定长度

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

看看是否有所作为。

另请注意显式&通过引用传递输出变量,但我不知道它是否仍然需要。

答案 3 :(得分:0)

我怀疑这会导致您的问题,但为什么使用DISTINCT

这只是一个代码 - 只要你看到它,就意味着有可能返回正在使用DISTINCT“处理”的重复项,以及为什么要返回重复项可能需要查看。

答案 4 :(得分:0)

不确定您运行的是哪个版本的PHP,但我认为在某些较旧版本的PHP中,您需要通过引用传递变量以获取值再次出现:

所以你需要把&调用函数时变量前的字符:

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

同样根据this link,某些版本的输出参数存在问题

答案 5 :(得分:0)

嗯。一些评论

1)“mssql_execute($ procedure,$ conn);”错误的是第二个参数不是连接。

2)如果你得到“存储过程执行失败”,那么我必须在freetds.conf中创建一个数据库主机并引用它。

那时,我没有得到错误,但我也没有得到输出参数。这是RHEL5上的PHP 5.1。

如果我启用freeTDS日志记录,我会看到数据返回到返回数据包中。此时,我不知道为什么它也不起作用(除了PHP的SQL服务器支持有点缺乏!)

答案 6 :(得分:0)

我遇到了同样的问题。

假设您使用FreeTDS驱动程序与SQL Server进行通信,则驱动程序的工作方式存在已知问题。它在FAQ

中突出显示

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

常见问题解答中建议的API文档在这里,但我找不到使用PHP访问它的方法:

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

我仍然无法解决这个问题,而且我正处在一起放弃输出参数。

答案 7 :(得分:0)

我通过Adodb Library以非常简单的方式做到了这一点......

$ addProduct = $ obj-&gt; ExecuteQuery(“Begin; DECLARE @ProductCode as varchar(100); EXEC CREATEPRODUCT'$ pname','$ price',@ ProductCode OUTPUT,'$ merchantId'; select @ProductCode;端;“);

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

有关更多说明,您可以访问此网站.. http://developer99.blogspot.com/2011/07/calling-ms-sql-sp-from-php.html