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执行时才会停止?
答案 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();
}