【问题标题】:Perl, error when attempting to run a stored procedure in SQL ServerPerl,尝试在 SQL Server 中运行存储过程时出错
【发布时间】:2020-01-12 08:38:55
【问题描述】:

我正在尝试执行一个存储过程,该过程在表上具有 3 个 nvarchar(max) 类型的列。但是,我收到以下错误:

在 H2::Controller::AP->apge 中捕获异常“DBD::Sybase::st fetchrow_hashref 失败:服务器消息编号=4004 严重性=16 状态=1 行=48 服务器=DEV 过程=sp_List 文本=Unicode无法使用 DB-Library(例如 ISQL)或 ODBC 版本 3.7 或更早版本将仅 Unicode 排序规则中的数据或 ntext 数据发送到客户端。位于 /AP.pm 第 361 行。”

我尝试将列转换为varchar(max)text,但仍然失败。

运行 SQL 会很好地检索数据,但调用存储过程会出错。

已创建具有三列文本类型的临时表。

失败并出现错误:

在 H2::Controller::AP->apge 中捕获异常“DBD::Sybase::st fetchrow_hashref failed: Server message number=4004 severity=16 state=1 line=47 server=DEV procedure=sp_List text=Unicode无法使用 DB-Library(例如 ISQL)或 ODBC 版本 3.7 或更早版本将仅 Unicode 排序规则中的数据或 ntext 数据发送到客户端。位于 /AP.pm 第 361 行。”

数据库连接是:

 has 'dbh' => ( is => 'rw', isa => 'DBI::db', default => sub{ return DATABASE::connect( system => 'xx', database => 'xxx', user => 'xxx' ); } );

对存储过程的调用:

my $sql ="exec tskMngmnt.dbo.sp_List ";

if (defined $a && $a ne "" && $a ne "NONE") {
   $sql .= "\@e = $a ";
} else {
   $sql .= "\@e = NULL ";
}

这是我们已安装的 DBI 版本:

perl -MDBI -e 'DBI-> installed_versions;'
  Perl            : 5.018002    (x86_64-linux-thread-multi)
  OS              : linux   (4.4.92-31-default)
  DBI             : 1.628
  DBD::mysql      : 4.021
  DBD::Sybase     : 1.15
  DBD::Sponge     : 12.010003
  DBD::SQLite     : 1.50
  DBD::Proxy      : 0.2004
  DBD::Gofer      : 0.015327
  DBD::File       : 0.42
  DBD::ExampleP   : 12.014311
  DBD::DBM        : 0.08

存储过程应返回我尝试检索的 1 行列。

【问题讨论】:

    标签: sql-server perl stored-procedures sybase


    【解决方案1】:

    从错误消息中可以看出,您的 Sybase 的 Perl DBD 驱动程序已使用“DBLib”进行编译,而该驱动程序已多年未得到维护。它在 1990 年代被 CTLib 取代。 DBLib 不支持多字节字符集。

    您可能希望升级/重新编译 DBD 驱动程序,或将其替换为 Microsoft 的 ODBC 驱动程序,Microsoft 为 Linux 提供此类驱动程序以及他们的 MS SQL for Linux 产品。

    MS SQL Sever ODBC Driver on Linux

    如果您使用的是 FreeTDS,则可以通过更改此答案中提到的协议版本号来获得一些好处。

    Change TDS Protocol Version

    【讨论】:

      猜你喜欢
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 2018-05-12
      相关资源
      最近更新 更多