这个问题涉及:
PHP版本5.3.6
用于SQL Server 的PHP的Microsoft驱动程序
我正在尝试从存储过程中正确检索数据。
此问题假定存在以下存储过程:
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)
我会得到一个具有一行的记录集,该记录集具有一个具有数据"的字段;统治博士">
几分钟前我刚刚遇到了同样的问题,这个线程为我指明了一个可行的解决方案(我不确定它是否是一个"正确"的解决方案,但它有效(。
事实上,问题并不是由"SET NOCOUNT ON"引起的。在我的例子中,调试后留下了几个PRINT语句。
看起来SP的任何输出(实际记录集除外(都会导致此问题。
我解决了这个问题。
如果从存储过程中提交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!"的记录集