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
Функция вызывается через: "EXEC main_procedure 1234", где 1234 - это идентификатор пользователя, который передается отдельным функциям update_metric. Каждая отдельная процедура 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?
Попробуйте этот подход, не сильно отличающийся, но стоит попробовать.
Не уверен, что это опечатка, но метод 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();
}