tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Mssql 2005 offset (stránkování)

před 6 lety

rumcais1
Člen | 76

Můžete mi někdo poradit jak řešíte v dibi nějak univerzálně offset (stránkování). Díky

před 6 lety

Milo
Nette Core | 1119

Univerzálně modifikátorem %ofs, viz. Quick Start.

před 6 lety

rumcais1
Člen | 76

Používám driver DibiMsSql2005Driver a tady offset není naimplementován.

před 6 lety

Milo
Nette Core | 1119

Aha, nevšiml jsem si titulku. S MSSQL dělám je vyjímečně, takže rada nebude moc fundovaná. Co vím, u MSSQL2005 se musel používat subquery, u MSSQL2012 už je OFFSET. O univerzálním řešení nevím. Bylo by fajn, kdyby někdo více MSSQL znalý dodělal v driveru implementaci.

před 6 lety

Horyczech
Člen | 6

Zkus to jeste nejak takto:

SELECT id,col1,col2,col3
FROM (
SELECT id,col1,col2,col3,ROW_NUMBER() OVER (ORDER BY id) AS RowNum
FROM tabulka
WHERE nekde = neco
) AS tbl
WHERE tbl.RowNum BETWEEN <offset> AND <offset + pocet radku>

Editoval Horyczech (28. 3. 2013 12:20)

před 6 lety

tomasnikl
Člen | 138

Milo napsal(a):

Aha, nevšiml jsem si titulku. S MSSQL dělám je vyjímečně, takže rada nebude moc fundovaná. Co vím, u MSSQL2005 se musel používat subquery, u MSSQL2012 už je OFFSET. O univerzálním řešení nevím. Bylo by fajn, kdyby někdo více MSSQL znalý dodělal v driveru implementaci.

a kde se MSSQL2012 driver da stahnout? Na githubu ani v zip balicku ho nevidim =o/ taky tento problem aktualne resim.

Dekuju!

před 6 lety

Milo
Nette Core | 1119

Pro MSSQL2012 se používa Sqlsrv driver.

před 6 lety

tomasnikl
Člen | 138

fakt jsem to potreboval behem chvile opravit a rozchodit, vytvoril jsem takovyto hnus ktery pro muj pripad kupodivu funguje… buh vi co to udela v jinych situacich ktere nastesti nepotrebuju resit.. kdyby mel nekdo cas, bylo by fajn to prepsat tak, aby to vypadalo k svetu:

ovladac pro mssql 2005.. trida DibiMsSql2005Driver (mysql2005.php) a jedna upravena metoda

/**
 * Injects LIMIT/OFFSET to the SQL query.
 * @param  string &$sql  The SQL query that will be modified.
 * @param  int $limit
 * @param  int $offset
 * @return void
 */
public function applyLimit(&$sql, $limit = 0, $offset = 0)
{
    // offset support is missing
    if ($limit >= 0) {
        $sql = str_replace('SELECT', 'SELECT TOP ' . (int) $limit . '', $sql);

        //default zakomentovano $sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ')';
    }

    preg_match_all("/\[.*?\]/",$sql,$matches);
    $table = $matches[0][0];

    if ($offset || $limit && $limit > 1) {
        $c = $offset+$limit;
        $sql = 'SELECT *
        FROM (
        SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS RowNum
        FROM '.$table.'
        ) AS tbl
        WHERE tbl.RowNum BETWEEN '.$offset.'+1 AND '.$offset.'+'.$limit.'';

        //default zakomentovano throw new DibiNotImplementedException('Offset is not implemented.');
    }

}