Support INSERT RETURNING for SQL Server
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / SQLMaker / MSSQL.pm
CommitLineData
84ddb3da 1package # Hide from PAUSE
d5dedbd6 2 DBIx::Class::SQLMaker::MSSQL;
84ddb3da 3
4a233f30 4use warnings;
5use strict;
6
d5dedbd6 7use base qw( DBIx::Class::SQLMaker );
84ddb3da 8
9#
10# MSSQL does not support ... OVER() ... RNO limits
11#
12sub _rno_default_order {
13 return \ '(SELECT(1))';
14}
15
f1b1d954 16# more or less copy pasted directly from ::SQLMaker
17sub insert {
18 my $self = shift;
19 my $table = $self->_table(shift);
20 my $data = shift || return;
21 my $options = shift;
22
23 if (! $data or (ref $data eq 'HASH' and !keys %{$data} ) ) {
24 my @bind;
25 my $sql = sprintf(
26 'INSERT INTO %s DEFAULT VALUES', $_[0]->_quote($table)
27 );
28
29 if ( ($options||{})->{returning} ) {
30 my $s;
31 ($s, @bind) = $self->_insert_returning ($options);
32 $sql .= $s;
33 }
34
35 return ($sql, @bind);
36 }
37
38 my $method = $self->_METHOD_FOR_refkind("_insert", $data);
39 my ($sql, @bind) = $self->$method($data);
40
41 $sql = join " ", $self->_sqlcase('insert into'), $table, $sql;
42
43 if ($options->{returning}) {
44 my ($s, @b) = $self->_insert_returning ($options);
45 $sql =~ s/\bVALUES\b/$s VALUES/;
46 @bind = (@b, @bind);
47 }
48
49 return wantarray ? ($sql, @bind) : $sql;
50}
51
52
53# insert returning docs at
54# http://msdn.microsoft.com/en-us/library/ms177564.aspx
55
56sub _insert_returning {
57 my ($self, $options) = @_;
58
59 my $f = $options->{returning};
60
61 my @f_list = do {
62 if (! ref $f) {
63 ($f)
64 }
65 elsif (ref $f eq 'ARRAY') {
66 @$f
67 }
68 elsif (ref $f eq 'SCALAR') {
69 (
70 ($$f)
71 )
72 }
73 else {
74 $self->throw_exception("Unsupported INSERT RETURNING option $f");
75 }
76 };
77
78 return (
79 join ' ',
80 $self->_sqlcase(' output'),
81 join ', ',
82 map $self->_quote("INSERTED.$_"), @f_list,
83 );
84}
85
861