Как выполнить несколько запросов, используя PDO для Sql Server

0

Я хотел бы выполнить некоторые запросы, которые не возвращают набор результатов, а затем выполняют реальный запрос и извлекают его результат. Вот пример, который не работает:

<?php

try {
    $db = new PDO('dblib:host=myhost;dbname=master','user','password');


    $query = "declare @entier int = 1;";
    $db->exec($query);
    $query = "select @entier;";
    $stmt = $db->query($query);
    $rows = $stmt->fetchAll();
    print_r($rows);
}
catch (PDOException $e) {
    print ($e->getMessage());
}
catch (Exception $e) {
    print ($e->getMessage());
}

?>

Этот код не работает:

try {
    $db = new PDO('dblib:host=myhost;dbname=master','user','password');

    $query = "declare @entier int = 1; select @entier;";
    $stmt = $db->query($query);
    $rows = $stmt->fetchAll();
    print_r($rows);
}
catch (PDOException $e) {
    print ($e->getMessage());
}
catch (Exception $e) {
    print ($e->getMessage());
}

?>

Но этот код работает:

<?php

try {
    $db = new PDO('dblib:host=myhost;dbname=master','user','password');

    $query = "select 1;";
    $stmt = $db->query($query);
    $rows = $stmt->fetchAll();
    print_r($rows);
}
catch (PDOException $e) {
    print ($e->getMessage());
}
catch (Exception $e) {
    print ($e->getMessage());
}

?>

Спасибо за вашу помощь

Теги:
pdo
freetds

2 ответа

0

Я знаю, что это старо, но для других людей, находивших это от Google: вам нужно использовать PDOStatement :: nextRowset для повторения наборов результатов из ваших нескольких запросов.

Тем не менее, кажется, что есть проблемы с памятью при использовании nextRowset с dblib в некоторых версиях (он пытался выделить 94Tb в моем случае...), поэтому я закончил реинжиниринг, чтобы избежать множественных SQL-запросов вообще (вместо этого дублирование значения DECLARE, где он использовался).

0

PDO :: query docs (http://php.net/manual/it/pdo.query.php) говорят

PDO :: query() выполняет оператор SQL в одном вызове функции, возвращая набор результатов (если он есть), возвращаемый оператором как объект PDOStatement.

Это может означать, что вы можете выполнить с query() оба запроса с результатом и без него

  • 0
    Спасибо за ваш быстрый ответ, я изменил свой вопрос, чтобы быть более конкретным: строка запроса: «Declare @entier int = 1; select @entier; »ничего не возвращает.

Ещё вопросы

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