这个问题涉及:
PHP Version 5.3.6
我正在尝试从存储过程中正确检索数据。
此问题假定存在以下存储过程:
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!”
答案 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!”的记录集。