PHP PDO(MSSQL)无法获取OUPUT参数

时间:2015-11-09 20:35:01

标签: php sql-server pdo freetds

我正在尝试使用bindParam(PHP PDO)获取OUTPUT。 PHP PDO库是FreeTDS for MS SQL驱动程序。无论我做什么,我似乎无法在php.net上建议的绑定参数中获得“OUTPUT”。我已经验证我可以调用EXEC并返回结果集(使用select),但OUTPUT参数永远不会改变。

PHP代码。 $ this-> db是一个PDO对象

$stmt = $this->db->prepare("EXEC ".$this->db_schema."[".$this->procedure."] :error_num, :error_msg");
$error_num = 0;
$error_msg = '';
$stmt->bindParam(':error_num', $error_num, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(':error_msg', $error_msg, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 2000);
$stmt->execute();
var_dump($stmt);
echo "\nerror_num: $error_num";
echo "\nerror_msg: $error_msg\n\n";

测试输出的存储过程

USE [NGCustom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [web].[addTest] (
    @error_num int OUTPUT,
    @error_msg VARCHAR(MAX) OUTPUT
)

AS

BEGIN 
SET @error_num = 99
SET @error_msg = 'Error! Oh my gosh!'
END
GO

PHP的输出:

object(PDOStatement)#77 (1) {
  ["queryString"]=>
  string(54) "EXEC [NGCustom].[web].[addTest] :error_num, :error_msg"
}

error_num: 0
error_msg: 

2 个答案:

答案 0 :(得分:4)

AFAIK,FreeTDS驱动程序不支持OUTPUT参数。从我的团队进行评估时我就记得这一点。

这就是为什么它不起作用: http://www.freetds.org/faq.html#ms.output.parameters

编辑:这是来自pyodbc(也在FreeTDS上运行)的参考,所以同样适用:https://code.google.com/p/pyodbc/wiki/StoredProcedures

引用:“结果:由于此时我们无法使用输出参数,因此您需要在结果集中返回结果。通常这意味着只使用SELECT语句结束存储过程。”

您需要使用SELECT。

答案 1 :(得分:1)

您的存储过程正在分配参数,但不会返回它们。

BEGIN 
 SET @error_num = 99
 SET @error_msg = 'Error! Oh my gosh!'
 SELECT @error_num, @error_msg;  --add this line
END
GO