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 строк без каких-либо ошибок, что не так с моим кодом ? пожалуйста, помогите мне!
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