Проблема на стороне FreeTDS.У меня была такая же проблема ранее, и я успешно исправил ее, преобразовав возвращенные поля в varchar
в операторе select
.
Если у вас нет доступа для изменения исходного запроса, вы можете сделатьнекоторое регулярное выражение ищет и заменяет возвращаемую переменную $sql
в вашем коде.В частности, если исходный запрос имеет часть, которая выглядит как
SELECT field1, field2, field3 FROM ...
После того, как вы получите оператор запроса, вы можете выполнить
my $new_sql;
if ($sql =~ /SELECT\s+(.*)\s+FROM/i) { # match selected field string
my $field_str = $1;
my @fields = split ",", $field_str; # parse individual fields
map s/\s//g, @fields; # get rid of spaces
my $new_str = join ", ", (map {sprintf "convert(varchar, $_)"} @fields); # construct new query string
my $quoted_field_str = quotemeta($field_str); # prepare regex replacement string
$new_sql = $sql;
$new_sql =~ s/$quoted_field_str/$new_str/i # actual replacement
}
print $new_sql;
Конечно, если ваш исходный оператор большесложный, вы должны распечатать его и проверить, как изменить его с помощью общей замены, несущей тот же дух.Кроме того, вы можете попросить своего администратора БД (или любого, кто имеет доступ к хранимой процедуре) напрямую изменить фактический запрос.
Надеюсь, это поможет.