检索存储过程返回的数据:Php& MS SQL SERVER

时间:2011-07-27 21:13:08

标签: php sql-server sql-server-2008 sql-server-2005

  

这个问题涉及:

     

PHP Version 5.3.6

     

Microsoft Drivers for PHP for 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)

我会找回一个记录集,其中一行有一个字段,其中包含数据“Doctor Who Rules!”

2 个答案:

答案 0 :(得分:1)

我刚刚在几分钟前遇到了同样的问题,这个线程指向了一个有效的解决方案(我不确定它是一个“正确”的解决方案,但它确实有效)。

实际上,问题不是由“SET NOCOUNT ON”引起的。在我的例子中,调试后留下了几个PRINT语句。

看起来除了实际记录集之外的SP的任何输出都会导致问题。

答案 1 :(得分:0)

我发现了问题。

如果从存储过程中省略SET NOCOUNT ON,我的示例中的PHP代码将正常工作。在过程中使用SET 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);

您最终会得到一个包含字符串“Doctor Who Rules!”的记录集。