服务器端处理Datatables分页Microsoft SQL

时间:2019-03-28 09:46:05

标签: php jquery sql sql-server datatables

我正在尝试使用带有MS SQL的PHP​​ PDO设置数据表的分页,因为“限制”不适用,我发现很难使代码正常工作。

我已经尝试过“ 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条过滤的记录。enter image description here

更新1:

这是我试图在MS SQL服务器中对其进行测试但仍出现错误(使用MS SQL 2008)的查询的屏幕截图

SQL Query

2 个答案:

答案 0 :(得分:0)

MSSQL中使用限制,您将需要这样编写查询:

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

这将跳过前20条记录,并获取下10条记录。

答案 1 :(得分:0)

您的方法取决于SQL Server版本。

基于ORDER BY子句且OFFSETFETCH作为paging solution的方法需要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);        
}
?>