Kết quả 1 đến 2 của 2
  1. #1
    Super Moderator tinhphaistc's Avatar
    Ngày tham gia
    01-03-2013
    Bài viết
    693
    Cảm ơn
    244
    Được cảm ơn 278 trong 210 bài viết

    MSSQL Limit - A working FIX, lỗi limit codeingiet mssql server 2008,2014,2012

    Chào cả nhà.
    hôm nay mình làm việc với codeigniter với mssql server 2014 thì phát hiện ra một BUG khá hay. đó là không limit được.
    Mình đã tìm ra được cách fix.
    Bạn tìm file.

    ../system/database/drivers/mssql/mssql_driver.php
    tìm tới dòng 641.
    thây thế toàn bộ function _limit bằng function sau.
    PHP Code:
    protected function _limit($sql$limit$offset)
            {
             if(
    $offset === FALSE
             {
              
    // Do simple limit if no offset
              
    $i $limit $offset;
              return 
    preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' '$sql);
             }
             else
             {
              if(!
    $this->ar_orderby)
              {
               
    // We do not have an orderBy column set and do not have the tableName
               // here, so grab the table name from the $sql statement by regex and 
               // then grab the first column of the tableName in the $sql statement
               // from the schema and let that be the orderBy column. Phew.
               
    $match_pattern '/(.*FROM )/s';
               
    $match_replacement '';
               
    $table preg_replace($match_pattern$match_replacement$sql);
               
    $orderBy  "ORDER BY (SELECT [COLUMN_NAME] FROM [information_schema].[columns] WHERE [TABLE_NAME] = '".$table."' AND [ORDINAL_POSITION] = 1)";
              }
              else
              {
               
    $orderBy  "ORDER BY ";
               
    $orderBy .= implode(', '$this->ar_orderby);
              }
              if (
    $this->ar_order !== FALSE)
              {
               
    $orderBy .= ($this->ar_order == 'desc') ? ' DESC' ' ASC';
              }
              
    $sql preg_replace('/(\\'$orderBy .'\n?)/i',''$sql);
              
    $sql preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 row_number() OVER ('.$orderBy.') AS CI_offset_row_number, '$sql);


              if(!
    $this->ar_orderby)
              {
               
    // No ColumnName so do a wildcard   
               
    $columns '*';
              }
              else
              {
               
    $columns implode(',',$this->ar_select);
              }
              
    $newSQL "SELECT " $columns " \nFROM (\n" $sql ") AS A \nWHERE A.CI_offset_row_number BETWEEN (" .($offset 1) . ") AND (".($offset $limit).")";
              return 
    $newSQL;
             }
            } 
    như vậy chúng ta đã có thể limit được rồi nhé các bạn.
    THÔNG TIN HỖ TRỢ DIỄN ĐÀN CODEIGNITER VIỆT NAM
    Email: tinhphaistc@gmail.com

  2. #2
    Moderator timhieu's Avatar
    Ngày tham gia
    24-06-2013
    Bài viết
    186
    Cảm ơn
    41
    Được cảm ơn 15 trong 14 bài viết
    À bên sql server ko có limit thay vào đó là top nhé

    ví dụ

    Select top 10 * from [table] lấy ra 10 dòng đầu tiên

    ở đây mình nói luôn cách dùng theo limit lấy ra từ dòng n đến dòng m

    MSSQL Limit - A working FIX, lỗi limit codeingiet mssql server 2008,2014,2012
    Sửa lần cuối bởi timhieu; 19-11-2014 lúc 12:02 AM.

Chia sẽ và Bình Luận chủ đề MSSQL Limit - A working FIX, lỗi limit codeingiet mssql server 2008,2014,2012 trên facebook

Các từ khóa xuất hiện trên google của chủ đề

Chưa có từ khóa lên top google

Tag của Chủ đề này - Hãy Thêm Tags Để bài viết nhanh lên top google

Quyền viết bài

  • Bạn không thể đăng chủ đề mới
  • Bạn không thể gửi trả lời
  • Bạn không thể gửi đính kèm
  • Bạn không thể sửa bài
  •