Commit | Line | Data |
ac93965c |
1 | package # Hide from PAUSE |
2 | DBIx::Class::SQLAHacks::MSSQL; |
3 | |
7275194d |
4 | use warnings; |
5 | use strict; |
6 | |
ac93965c |
7 | use base qw( DBIx::Class::SQLAHacks ); |
8 | use Carp::Clan qw/^DBIx::Class|^SQL::Abstract/; |
9 | |
7275194d |
10 | # an MSSQL-specific implementation of the Row-Number-Over limiting |
11 | # technique |
12 | |
13 | sub _MSRowNumberOver { |
584d2dd1 |
14 | my ($self, $sql, $order, $rows, $offset ) = @_; |
15 | |
1475a98b |
16 | # get the order_by only (or make up an order if none exists) |
7275194d |
17 | my $order_by = $self->_order_by( |
1475a98b |
18 | (delete $order->{order_by}) || \ '(SELECT (1))' |
7275194d |
19 | ); |
20 | |
21 | # whatever is left |
22 | my $group_having = $self->_order_by($order); |
23 | |
24 | $sql = sprintf (<<'EOS', $order_by, $sql, $group_having, $offset + 1, $offset + $rows, ); |
584d2dd1 |
25 | |
7275194d |
26 | SELECT * FROM ( |
27 | SELECT orig_query.*, ROW_NUMBER() OVER(%s ) AS rno__row__index FROM (%s%s) orig_query |
28 | ) rno_subq WHERE rno__row__index BETWEEN %d AND %d |
584d2dd1 |
29 | |
7275194d |
30 | EOS |
584d2dd1 |
31 | |
7275194d |
32 | $sql =~ s/\s*\n\s*/ /g; # easier to read in the debugger |
584d2dd1 |
33 | return $sql; |
ac93965c |
34 | } |
35 | |
36 | 1; |