Oznámení
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
- 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.');
}
}