# ... my $sth = $dbh->prepare('INSERT INTO foo (pkey, bar, baz) VALUES (?, ?, ?)') or die "Error: #DBI::errstr"; # assuming 'bar' and 'baz' are in @data, which is a 2D array my @ids = (); # you will have all primary keys here for (@data){ my $id = getID($dbh, 'foo_sequence'); redo unless $id; # or just die() instead $sth->execute($id, @$_); push @ids, $id; } # ... sub getID{ my ($dbh, $seqID) = @_; # this is for Oracle, you may need to tweak it for MS SQL my $sth = $dbh->prepare_cached(qq/SELECT $seqID.NEXTVAL FROM dual/) or return undef; $sth->execute() or return undef; my @row = $sth->fetchrow_array(); return @row ? $row[0] : undef; }