Мне нужно использовать хранимую процедуру для сбора некоторых данных из базы данных, и для этого мне был предоставлен SQL-код:
declare @p3 xml
set @p3=convert(xml,N'<root><r i="XXXXXXXXXXXX"/></root>')
declare @p8 xml
set @p8=convert(xml,N'<root><r i="274"/><r i="276"/><r i="275"/><r i="155"/><r i="20"/><r i="520"/><r i="758"/><r i="760"/><r i="156"/><r i="172"/></root>')
exec spu_SearchItems @siteName=N'XXXXXXXXXXXX',@searchString=N'*',@searchLocations=@p3,@includeChildren=0,@includeSearchLocations=0,@includeExtensions=0,@maxResults=501,@classIds=@p8
Я заменил конфиденциальные данные на XXXXXXXXXXXX. Этот запрос работает при использовании в Microsoft SQL Management Studio и получает все, что мне нужно.
Моя проблема в том, что когда я выполняю этот же код в моем Perl-скрипте, он возвращает ссылку на хеш, что заставляет меня думать, что либо я не использую оператор SQL должным образом, либо я не могу «читать» информацию обратно.
Я использую это для настройки оператора sql:
sub newquery {
my $sql = q(declare @p3 xml
set @p3=convert(xml,N'<root><r i="XXXXXXXXXXXX"/></root>')
declare @p8 xml
set @p8=convert(xml,N'<root><r i="274"/><r i="276"/><r i="275"/><r i="155"/><r i="20"/><r i="520"/><r i="758"/><r i="760"/><r i="156"/><r i="172"/></root>')
exec spu_SearchItems @siteName=N'XXXXXXXXXXXX',@searchString=N'*',@searchLocations=@p3,@includeChildren=0,@includeSearchLocations=0,@includeExtensions=0,@maxResults=501,@classIds=@p8);
&dbMasterSub($sql);
}
и это для вызова в базу данных.
sub dbMasterSub() {
my $sql = shift;
my @row;
# print $sql."\n";
my $port = 1443;
my $dsn = "Provider=sqloledb;Trusted Connection=yes;";
$dsn .= "Server=" . $myServer . ";Database=$myDB;";
eval {
my $dbh = DBI->connect( "dbi:ADO:$dsn", $myUser, $myPass, { RaiseError => 1, AutoCommit => 1 } );
my $sth;
if ( $sql eq "ping" ) {
my $ping = $dbh->ping();
return $ping;
}
else {
$sth = $dbh->prepare( $sql );
#Execute the statement
$sth->execute();
print "sth -> $sth\n";
open( my $fh, '>:encoding(UTF-8)', $tagsPaths );
print $fh "{\n";
my $index = 0;
while ( my $row = $sth->fetchrow_array() ) {
print "$row" . "\n";
if ( $index == 0 ) {
print $fh $row;
$index = $index + 1;
}
else {
print $fh ",\n" . $row;
}
}
print $fh "\n}";
close $fh;
$sth->finish();
}
$dbh->disconnect();
};
}
Кроме того, я попытался использовать fetchrow_hashref () вместо fetchrow_array (), но это не имеет никакого значения.
Надеюсь, вы сможете указать мне правильное направление. Спасибо.
РЕДАКТИРОВАТЬ: Я запустил запрос на MS SQL, и он возвращает 3 набора результатов. Мне нужен набор результатов 1, но я не знаю, как к нему добраться.