mirror of
https://github.com/silverstripe/silverstripe-mssql
synced 2024-10-22 08:05:53 +02:00
Better support for LIMIT, minimal support for OFFSET.
This commit is contained in:
parent
1290b0e4c7
commit
a2d2b73893
@ -228,6 +228,7 @@ class MSSQLDatabase extends Database {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: test this, as far as I know we haven't got the create method working...
|
* TODO: test this, as far as I know we haven't got the create method working...
|
||||||
|
* 4th Jun 09 / Tom Rix - worked for me
|
||||||
*/
|
*/
|
||||||
public function createDatabase() {
|
public function createDatabase() {
|
||||||
$this->query("CREATE DATABASE \"$this->database\"");
|
$this->query("CREATE DATABASE \"$this->database\"");
|
||||||
@ -990,9 +991,6 @@ class MSSQLDatabase extends Database {
|
|||||||
|
|
||||||
if($sqlQuery->orderby && strtoupper(trim($sqlQuery->orderby)) == 'RAND()') $sqlQuery->orderby = "NEWID()";
|
if($sqlQuery->orderby && strtoupper(trim($sqlQuery->orderby)) == 'RAND()') $sqlQuery->orderby = "NEWID()";
|
||||||
|
|
||||||
//TODO: remove me when the limit function supposedly works
|
|
||||||
$sqlQuery->limit='';
|
|
||||||
|
|
||||||
//Get the limit and offset
|
//Get the limit and offset
|
||||||
$limit='';
|
$limit='';
|
||||||
$offset='0';
|
$offset='0';
|
||||||
@ -1011,6 +1009,18 @@ class MSSQLDatabase extends Database {
|
|||||||
|
|
||||||
$text='';
|
$text='';
|
||||||
$limitText='';
|
$limitText='';
|
||||||
|
|
||||||
|
// If there's a limit but no offset, just use 'TOP X'
|
||||||
|
// rather than the more complex sub-select method
|
||||||
|
if ($limit != 0 && $offset == 0) {
|
||||||
|
$limitText = 'SELECT TOP '.$limit;
|
||||||
|
$sqlQuery->limit = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uncomment this to enable the EXPERIMENTAL offset support
|
||||||
|
$sqlQuery->limit = null;
|
||||||
|
|
||||||
|
// Geoff's sub-select way
|
||||||
if($sqlQuery->limit) {
|
if($sqlQuery->limit) {
|
||||||
$text='SELECT * FROM ( SELECT ROW_NUMBER() OVER (';
|
$text='SELECT * FROM ( SELECT ROW_NUMBER() OVER (';
|
||||||
$limitText=' ORDER BY ' . $sqlQuery->orderby . ') AS Number,';
|
$limitText=' ORDER BY ' . $sqlQuery->orderby . ') AS Number,';
|
||||||
@ -1034,10 +1044,11 @@ class MSSQLDatabase extends Database {
|
|||||||
if($limitText=='')
|
if($limitText=='')
|
||||||
if($sqlQuery->orderby) $text .= " ORDER BY " . $sqlQuery->orderby;
|
if($sqlQuery->orderby) $text .= " ORDER BY " . $sqlQuery->orderby;
|
||||||
|
|
||||||
// Limit not implemented
|
// Geoff's sub-select way
|
||||||
if($sqlQuery->limit){
|
if($sqlQuery->limit){
|
||||||
$text.=') AS Numbered WHERE Number BETWEEN ' . $offset . ' AND ' . ($offset+$limit) . ';';
|
$text.=') AS Numbered WHERE Number BETWEEN ' . $offset . ' AND ' . ($offset+$limit) . ';';
|
||||||
}
|
}
|
||||||
|
|
||||||
//if($sqlQuery->limit) {
|
//if($sqlQuery->limit) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1059,12 +1070,18 @@ class MSSQLDatabase extends Database {
|
|||||||
select ROW_NUMBER() over (order by SiteTree.Title) AS RowNum, *
|
select ROW_NUMBER() over (order by SiteTree.Title) AS RowNum, *
|
||||||
FROM SiteTree) as Numbered
|
FROM SiteTree) as Numbered
|
||||||
WHERE RowNum Between 0 And 1;
|
WHERE RowNum Between 0 And 1;
|
||||||
|
|
||||||
|
Tom's way
|
||||||
|
WITH SQLQueryTable AS (
|
||||||
|
SELECT *,
|
||||||
|
ROW_NUMBER() OVER (ORDER BY XXX) AS 'SQLQueryRowNumber'
|
||||||
|
FROM YYY
|
||||||
|
) SELECT * FROM SQLQueryTable WHERE SQLQueryRowNumber BETWEEN 10 AND 20;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
|
||||||
return $text;
|
return $text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user