Как сделать SELECT на SQL Server 2005 из Perl-скрипта?Подключиться к SQL Server 2005 с Perl и сделать SELECT
ответ
Вам нужно будет использовать DBI, и вы, вероятно, лучше с помощью поставщик DBD :: ODBC от (CPAN). Если вы не знаете о DBI, вам нужно прочитать об этом. Есть книга (Programming the Perl DBI), которая старая, но все еще действительная.
Тогда что-то вроде следующего:
use strict;
use warnings;
use DBI;
# Insert your DSN's name here.
my $dsn = 'DSN NAME HERE'
# Change username and password to something more meaningful
my $dbh = DBI->connect("DBI:ODBC:$dsn", 'username', 'password')
# Prepare your sql statement (perldoc DBI for much more info).
my $sth = $dbh->prepare('select id, name from mytable');
# Execute the statement.
if ($sth->execute)
{
# This will keep returning until you run out of rows.
while (my $row = $sth->fetchrow_hashref)
{
print "ID = $row->{id}, Name = $row->{name}\n";
}
}
# Done. Close the connection.
$dbh->disconnect;
Вот простой пример использования DBI (отредактировано после комментария):
use DBI;
my $dbh = DBI->connect("dbi:Sybase:database=<dbname>;server=<servername>",
<user>, <password>,
{ PrintError => 0, RaiseError => 1 });
my $sth = $dbh->prepare("select field from table");
my $result = $sth->execute();
while(my $result = $sth->fetchrow_hashref) {
print $result->{field};
}
$sth->finish;
$dbh->disconnect;
Надеясь, чтобы увидеть другие ответы с более простым решением :)
Вам вообще не нужно указывать dbi_connect_method. И я бы рекомендовал использовать «PrintError => 0, RaiseError => 1», чтобы возникли ошибки SQL ... тем более, что вы не делаете никаких проверок ошибок;) Вы можете даже сократить, просто сказав: «для моего $ row in (@ {$ dbh-> selectall_arrayref ("select field from table", {Slice => {}})}) {print "$ row -> {field} \ n";} Если вы собирается использовать fetchrow_hashref или его друзей, стоит установить «FetchHashKeyName =>« NAME_lc »при подключении к БД тоже, некоторые люди настаивают на использовании CamelCase для имен столбцов. Но кроме всего этого, штраф :) – araqnid
Хорошие предложения, отредактировано – Andomar
#
# ------------------------------------------------------
# run a passed sql and retun a hash ref of hash refs
# ------------------------------------------------------
sub doRunSqlGetHashRef {
my $self = shift ;
my $sql = shift ;
my $hsr_meta = {} ;
my $hsr = {} ;
my $rowid = 0 ;
my $flag_filled_hsr_meta = 0 ;
my $hsr_meta_colid = 0 ;
use DBI;
my $dbs = "dbi:ODBC:DRIVER=FreeTDS;DSN=DEV_MSSQLSRV_DSN";
# verify by :
# isql -v DEV_MSSQLSRV_DSN user pwd
my $dbh = DBI->connect($dbs, $db_user, $db_user_pw)
or die "CONNECT ERROR! :: $DBI::err $DBI::errstr $DBI::state $!\n";
if (defined($dbh)) {
# Prepare your sql statement (perldoc DBI for much more info).
my $sth = $dbh->prepare($sql) ;
# Execute the statement.
if ($sth->execute) {
# This will keep returning until you run out of rows.
while (my $row = $sth->fetchrow_hashref) {
# fill in the meta hash reference with the col names
if ($flag_filled_hsr_meta == 0) {
for (@{$sth->{ 'NAME' }}) {
# debug ok print "$_ => $row->{$_}\t";
$hsr_meta->{ $hsr_meta_colid } = $_ ;
$hsr_meta_colid++ ;
$flag_filled_hsr_meta = 1 ;
}
}
# p ($row) ; # row level debug ...
$hsr->{ $rowid } = $row ;
$rowid++ ;
}
}
# Done. Close the connection.
$dbh->disconnect;
# debug ok p($hsr_meta) ;
return ($hsr_meta , $hsr) ;
}
else {
print "Error connecting to database: Error $DBI::err - $DBI::errstr\n";
}
}
#eof sub doRunSqlGetHashRef
Если вы на платформе Unix-ish, DBD :: ODBC, скорее всего, будет больно, и, вероятно, лучше использовать DBD :: Sybase с FreeTDS. (Ну, UnixODBC был очень болезненным в прошлый раз, когда я попробовал) – araqnid
@araqnid - Я собирался упомянуть FreeTDS, но решил не усложнять это. У меня была радость самого UnixODBC :) –