2013-08-26 3 views
0

Это мой PHP код:LIMIT команда SQL Server

require_once ('ConfigSQL.php'); 

$per_page = 10; 
if(isset($_GET['page'])) { 
    $page = ($_GET['page'] - 1); 
} 
else { 
    $page = 0; 
} 
    $QueryCharacter = mssql_query (" 
     SELECT Character.AccountID, Character.Name, Character.CtlCode, 
     AccountCharacter.Number, AccountCharacter.ID, 
     memb___id, memb_name, memb__pwd2, mail_addr 
     FROM Character, AccountCharacter, MEMB_INFO 
     WHERE Character.AccountID=AccountCharacter.ID AND 
     AccountID=memb___id AND AccountCharacter.ID=memb___id 
     LIMIT {$page},{$per_page} 
     "); 

$rows = mssql_fetch_row($QueryCharacter); 
$pages = $rows/$per_page; 
$pages = $pages ? ((int)$pages == $pages) : ((int)$pages + 1); 

И моя ошибка:

Warning: mssql_query() [function.mssql-query]: message: Line 2: Incorrect syntax near ','. (severity 15) in C:\xampp\htdocs\Pages\EditCharacter.php on line 19

Warning: mssql_query() [function.mssql-query]: Query failed in C:\xampp\htdocs\Pages\EditCharacter.php on line 19

Warning: mssql_fetch_row(): supplied argument is not a valid MS SQL-result resource in C:\xampp\htdocs\Pages\EditCharacter.php on line 21

Я знаю, что проблема заключается в 'LIMIT' в моем запросе SQL.

Как должен быть «ВЫБРАТЬ»?

+0

SQL Server [поддерживает TOP] (http://technet.microsoft.com/en-us/library/ms189463.aspx), не LIMIT –

+0

Какая версия SQL Server? С 2012 года вы можете использовать OFFSET ... FETCH, с предыдущими версиями paging намного сложнее (с использованием CTE и ROW_NUMBER(), или, возможно, TOP, когда вы находитесь на первых нескольких страницах). SQL Server не поддерживает LIMIT (и я рад, что это не так - это не совсем стандарт). –

+0

Возможный дубликат [Смещение строки в SQL Server] (http://stackoverflow.com/questions/187998/row-offset-in-sql-server) –

ответ

0

Попробуйте изменить свой запрос в это:

WITH paging AS (
    SELECT 
     ,Character.AccountID 
     ,Character.Name 
     ,Character.CtlCode 
     ,AccountCharacter.Number 
     ,AccountCharacter.ID 
     ,memb___id 
     ,memb_name 
     ,memb__pwd2 
     ,mail_addr 
     ,ROW_NUMBER() OVER (ORDER BY Character.AccountID) AS RowNr 
    FROM 
     Character, 
     AccountCharacter, 
     MEMB_INFO 
    WHERE 
     Character.AccountID = AccountCharacter.ID 
     AND AccountID=memb___id 
     AND AccountCharacter.ID=memb___id 
) 
SELECT TOP ({$per_page}) * 
FROM paging 
WHERE RowNr > {$page} * {$per_page} 
ORDER BY RowNr 

Обратите внимание, что страница 0 первая страница, 1 является вторым, и т.д.

Это использует общие выражения таблицы, представленные в MSSQL 2005, за ранее версии, что-то вроде этого, вероятно, следует работать (источник Efficient Paging (Limit) Query in SQLServer 2000?):

DECLARE @Sort int 

SET ROWCOUNT {$page} * {$per_page} 
SELECT @Sort = AccountID FROM Character ORDER BY AccountID 

SET ROWCOUNT {$per_page}  
SELECT 
    ,Character.AccountID 
    ,Character.Name 
    ,Character.CtlCode 
    ,AccountCharacter.Number 
    ,AccountCharacter.ID 
    ,memb___id 
    ,memb_name 
    ,memb__pwd2 
    ,mail_addr 
    ,ROW_NUMBER() OVER (ORDER BY Character.AccountID) AS RowNr 
FROM 
    Character, 
    AccountCharacter, 
    MEMB_INFO 
WHERE 
    Character.AccountID > @Sort 
    AND Character.AccountID = AccountCharacter.ID 
    AND AccountID=memb___id 
    AND AccountCharacter.ID=memb___id 
ORDER BY 
    Character.AccountID 
+0

Это не работает, я использую в SQL 2000 – Almog

+0

Ah, 2000 был давным-давно :) .. Я обновил свой ответ с чем-то еще, что вы можете попробовать. – TheQ

Смежные вопросы