使用pdo_sqlsrv执行存储过程


Executing a Stored Procedure with pdo_sqlsrv

我正试图弄清楚如何在sql server 2008上使用php5.3/pdo_sqlsrv执行存储过程。

我发现了这个代码:

$sql = new PDO( "sqlsrv:server=$server;Database = $database", $user, $password);
$query = "{? = CALL sp_Login(?, ?)}"; 
$stmt = $sql->prepare( $query ); 
$returnVariable = 0;
$inputVariable1 = 'input1';
$inputVariable2 = 'input2';
$stmt->bindParam(1,$returnVariable,PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,100);
$stmt->bindParam(2,$inputVariable1,PDO::PARAM_STR);
$stmt->bindParam(3,$inputVariable2,PDO::PARAM_STR);
$stmt->execute();
echo "Return value: ".$returnVariable;

存储过程有两个输入和一个输出参数,但似乎什么都不返回,返回值仍然是0.

我可以运行选择/插入查询,所以这不是连接。

关于使用pdo_sqlsrv的存储过程,有什么好的文档吗?

谢谢!

经过一天的搜索,我找到了一种调用sp.的方法。。。问题是存储过程正在运行一个insert查询,我不得不调用nextRowset()获取返回值

http://social.msdn.microsoft.com/Forums/en/sqldriverforphp/thread/55f21fc5-dbc0-4fe4-a4ae-f15905a4293a

$sql = new PDO( "sqlsrv:server=$server;Database = $database", $user, $password);
$input1 = "input1";
$input2 = "input2";
$return_value = -1;
$proc = '{? = CALL sp_Name (?, ?) }';
$stmt = $sql->prepare( $proc );
$stmt->bindParam(1,$return_value ,PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,4);
$stmt->bindParam(2,$input1,PDO::PARAM_STR);
$stmt->bindParam(3,$input2,PDO::PARAM_STR);
$stmt->nextRowset(); //skip INSERT result
$result = $stmt->fetch(PDO::FETCH_ASSOC);
/* Display the value of the output parameter  */
echo "Return value: ".$return_value.'<br>';

您的存储过程需要包含"SET NOCOUNT ON"语句,这样内的Insert语句就不需要调用nextRowset()方法。

也许这份手册对很有帮助

  // Example #4 Calling a stored procedure with an output parameter
  $stmt = $dbh->prepare("CALL sp_returns_string(?)");
  $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); 
  $stmt->execute();
  print "procedure returned $return_value'n";

  // Example #5 Calling a stored procedure with an input/output parameter
  $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
  $value = 'hello';
  $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 
  $stmt->execute();
  print "procedure returned $value'n";