MSSQL过程无法从PHP完成

时间:2014-11-07 15:55:24

标签: php sql-server stored-procedures pdo

PHP: 5.4.20 Windows
服务器:Microsoft SQL Server 2012

我遇到一个问题,当从PHP脚本调用时,以下存储过程不会完整运行(但它确实运行,没有返回错误):

CREATE PROCEDURE main_procedure (@uid int)
AS  
BEGIN
  DECLARE @NOW DATETIME
  SET @NOW = getDate()

  DELETE FROM metrics WHERE uid = @uid AND timestamp < @NOW
  EXEC update_metric_a @uid, @NOW
  EXEC update_metric_b @uid, @NOW
  EXEC update_metric_c @uid, @NOW
  EXEC update_metric_d @uid, @NOW
  EXEC update_metric_e @uid, @NOW
  EXEC update_metric_f @uid, @NOW
  EXEC update_metric_g @uid, @NOW
  EXEC update_metric_h @uid, @NOW
  EXEC update_metric_i @uid, @NOW
END

通过以下方式调用该函数:&#34; EXEC main_procedure 1234&#34;其中1234是传递给各个update_metric函数的用户ID。每个单独的update_metric_n过程都会为每个度量标准添加一条记录,然后在过去的12个月内进行分析,以按行逐月分解来填充该行。

从Microsoft SQL Management Studio调用时,该过程会正确执行所有步骤。

从PHP调用时,它会运行除最后一个程序之外的所有操作。

其他人都正常运行,但由于某种原因,最后一个没有运行。重新排序程序确认问题不是最后一个程序中的错误,因为它在移动到列表顶部时运行正常。

这是执行程序的PHP:

$conn = new PDO("sqlsrv:Server=######; Database=#####;", $user, $pass);
$conn->prepare("EXEC main_procedure ?");
$conn->execute(array("1234"));

关于为什么在第八个程序之后会停止的任何想法,但只有在通过PHP执行时才会停止?

1 个答案:

答案 0 :(得分:1)

尝试这种方法,没有显着差异,但值得一试。

不确定这是否是拼写错误,但execute()方法仅适用于prepare()返回的语句对象。

try {
    $conn= new PDO("sqlsrv:Server=######; Database=#####;", $user, $pass);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare("EXEC dbo.main_procedure @uid = ?");
    $stmt->execute(array("1234"));
} catch (PDOException $e) {
    echo 'PDO failed: ' . $e->getMessage();
}