PDO sqlsrv не выполняет запрос execute до конца



Я пытаюсь использовать PDO и оператор while loop в запросе sql server для вставки в базу данных, но цикл while не выполняется до конца, хотя он прекрасно работает с простым запросом, я использую только XAMPP для запуска сервера.



Вот мой скрипт для вставки всех дней с 2017-01-01 по 2018-01-01 (гггг-ММ-ДД):



try{
$dsn = "sqlsrv:Server=MyServer,1433;Database=MyDB;";
$db = new PDO($dsn, "sa", "MyPassword");
$db->setAttribute (PDO::SQLSRV_ATTR_QUERY_TIMEOUT, 60);

$query = "DELETE FROM TEST

declare @TempDate as date
declare @FDate as date = Cast('2017-01-01' as date)
declare @TDate as date = Cast('2018-01-01' as date)
declare @DayInMonthList as Table(AllDayDate varchar(8))

BEGIN
SET @TempDate = @FDate
WHILE(@TempDate < @TDate)
BEGIN
INSERT INTO TEST(FromDate, ToDate, TempDate) VALUES(@FDate, @TDate, @TempDate)
SET @TempDate =DateAdd(day, 1, @TempDate)
END
END";

$cmd = $this->db->prepare($query);
if(!$cmd->execute()){
throw new PDOException ($cmd->errorInfo());
}
}catch(PDOException $e) {
die("Error connecting to SQL Server: " . $e->getMessage());
}


Этот скрипт вставляет около 120 строк без каких-либо ошибок, что не так с моим кодом ? пожалуйста, помогите мне!

570   1  

1 ответ:

Попробуйте это

try{
    $dsn = "sqlsrv:Server=MyServer,1433;Database=MyDB;";   
    $db = new PDO($dsn, "sa", "MyPassword"); 
    $db->setAttribute (PDO::SQLSRV_ATTR_QUERY_TIMEOUT, 200); 
    $db->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $db->beginTransaction();
    $query = "DELETE FROM TEST

              declare @TempDate as date
              declare @FDate as date = Cast('2017-01-01' as date)
              declare @TDate as date = Cast('2018-01-01' as date)
              declare @DayInMonthList as Table(AllDayDate varchar(8))

              BEGIN
                   SET @TempDate = @FDate
                   WHILE(@TempDate < @TDate)
                   BEGIN
                        SET NOCOUNT ON;
                        INSERT INTO TEST(FromDate, ToDate, TempDate) VALUES(@FDate, @TDate, @TempDate)
                        SET @TempDate =DateAdd(day, 1, @TempDate) 
                   END
              END";

        $cmd = $db->prepare($query); 
        if(!$cmd->execute()){
            throw new PDOException ($cmd->errorInfo());
        }
        $db->commit();
}catch(PDOException $e) {
    die("Error connecting to SQL Server: " . $e->getMessage());
}

Всегда делайте beginTransaction и commit во время выполнения PDO, как показано ниже.

$db->beginTransaction();
$db->commit();

Также вы должны добавить приведенный ниже код перед инструкцией insert, чтобы остановить break from loop во время вставки.

SET NOCOUNT ON;

Я надеюсь, что это поможет вам. Если у вас есть какие-либо проблемы или сомнения, дайте мне знать.

Comments

    Ничего не найдено.