Обработка таблиц данных на стороне сервера, разбивка на страницы Microsoft SQL

#php #jquery #sql #sql-server #datatables

#php #jquery #sql #sql-сервер #таблицы данных

Вопрос:

Я пытаюсь настроить разбивку на страницы с таблицами данных, используя PHP PDO с MS SQL, поскольку «limit» неприменим, мне действительно сложно заставить код работать.

Я пробовал синтаксис «TOP», но он будет фильтровать только указанное число, и разбивка на страницы не будет работать.

Я пробовал смещение и выборку, но все еще не работает.

Это рабочий код при использовании Mysql, и его так легко понять и выполнить.

 if($_POST["length"] != -1)
   {
$query .= 'LIMIT ' . $_POST['start'] . ', ' . $_POST['length'];
   }
  

Это коды, которые я пробовал (извините, я не очень силен в кодировании) :

 //if($_POST["length"] != -1)
   {
Trial 1 : //$query .= "TOP " . $_POST['start'] . " OFFSET " .                     $_POST['length'];


Trial 2 : //$query .= "SELECT * from item ORDER BY id DESC offset 0 rows fetch next 10 rows only ";


    Trial 3 ://$query .="AND id BETWEEN ".intval( $_POST["start"] )." AND ".intval( $_POST["length"] );" "
  

}

Результатом должна быть разбивка на страницы с 10 отфильтрованными записями в каждой.введите описание изображения здесь

Обновление 1:

Вот скриншот запроса, который я пытался протестировать на сервере MS SQL, но получаю ошибку (используя MS SQL 2008)

SQL-запрос

Ответ №1:

Ваш подход зависит от версии SQL Server.

Подход, основанный на ORDER BY предложении с OFFSET и FETCH в качестве решения для подкачки, требует SQL Server 2012 . Ваш синтаксис кажется правильным, поэтому следующий код должен работать:

 <?php
if ($_POST["length"] != -1) {
    $query = "
        SELECT * 
        FROM item 
        ORDER BY id DESC OFFSET ".($_POST['start']-1)." ROWS FETCH NEXT ".$_POST["length"]." ROWS ONLY
    ";
}
?>
  

Для SQL Server 2008 вы можете использовать ROW_NUMBER() в качестве решения для подкачки:

 <?php
if ($_POST["length"] != -1) {
    $query = 
        "SELECT *
        FROM (
            SELECT 
                *, 
                ROW_NUMBER() OVER (ORDER BY id DESC) AS Rn
            FROM item
        )
        WHERE Rn BETWEEN ".$_POST['start']." AND ".($_POST['start']   $_POST['length'] - 1);        
}
?>
  

Комментарии:

1. Привет! спасибо вам за это. к сожалению, все еще не работает. Я использую коды, предоставленные вами для SQL server 2008, поскольку я использую именно эту версию. я опубликую снимок экрана, чтобы было понятно.

2. привет!, в нем отсутствует слово «sub». ———————————————————- sub WHERE Rn BETWEEN ". $_POST["start"] ." AND ". $_POST["start"] $_POST["length"] - 1) . its не показывает никаких ошибок, но разбивка на страницы по-прежнему не работает.

3. боже мой! теперь он работает отлично. я забыл убрать некоторые скобки, которые я добавил в тестовые коды. я только что добавил слово sub. это идеально. спасибо большое!

4. добавление запроса для обеспечения работы разбивки на страницы, похоже, отключает функции поиска. я не могу выполнить поиск сейчас, он просто возвращается к первым 10 строкам.

Ответ №2:

Для MSSQL использования ограничения вам нужно будет написать свой запрос следующим образом:

 ORDER BY X.Field
OFFSET 20 ROWS 
FETCH NEXT 10 ROW ONLY OPTION (RECOMPILE)
  

При этом будут пропущены первые 20 записей и будут извлечены следующие 10.

Комментарии:

1. привет! Спасибо. я пробовал это в MS SQL 2017, и это работает, но в настоящее время я работаю над версией 2008.