Процедура MSSQL не завершается из PHP

0

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?

Теги:
sql-server
stored-procedures
pdo

1 ответ

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();
}
  • 0
    Ты прав. Я опустил $ stmt = .... и он должен был читать как твой код. Я внес это изменение и увидел сообщение об ошибке «Активный результат для запроса не содержит полей». Посмотрев это вверх, вы увидите, что SET NOCOUNT ON должен решить эту проблему. В моем случае это не помогло устранить ошибку, но процедура выполняется полностью. (Интересно, нужно ли мне это во всех подпроцедурах)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню