Sql server Perl,尝试在SQL Server中运行存储过程时出错
我正在尝试执行一个存储过程,该存储过程的表上有3列类型为Sql server Perl,尝试在SQL Server中运行存储过程时出错,sql-server,perl,stored-procedures,sybase,Sql Server,Perl,Stored Procedures,Sybase,我正在尝试执行一个存储过程,该存储过程的表上有3列类型为nvarchar(max)。但是,我得到了以下错误: H2::Controller::AP->apge“DBD::Sybase::st fetchrow_hashref失败:服务器消息编号=4004严重性=16状态=1行=48服务器=开发过程=sp_列表文本=仅Unicode排序规则中的Unicode数据或ntext数据无法使用DB库(如ISQL)或ODBC版本3.7或更早版本发送到客户端。at/AP.pm行361。” 我尝试将列转换为va
nvarchar(max)
。但是,我得到了以下错误:
H2::Controller::AP->apge“DBD::Sybase::st fetchrow_hashref失败:服务器消息编号=4004严重性=16状态=1行=48服务器=开发过程=sp_列表文本=仅Unicode排序规则中的Unicode数据或ntext数据无法使用DB库(如ISQL)或ODBC版本3.7或更早版本发送到客户端。at/AP.pm行361。”
我尝试将列转换为varchar(max)
和text
,但仍然失败
运行SQL可以很好地检索数据,但调用存储过程会出错
已创建一个临时表,该表具有三列的文本类型
出现错误时失败:
在H2::Controller::AP->apge“DBD::Sybase::st fetchrow_hashref失败:服务器消息编号=4004严重性=16状态=1行=47服务器=开发过程=sp_列表文本=仅Unicode排序规则中的Unicode数据或ntext数据无法使用DB库(如ISQL)或ODBC版本3.7或更早版本发送到客户端。at/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行列。从错误消息中可以看出,您的Sybase Perl DBD驱动程序是使用“DBLib”编译的,而“DBLib”实际上已经多年没有维护过了。20世纪90年代,它被CTLib取代。DBLib不支持多字节字符集 您可能希望升级/重新编译DBD驱动程序,或者用Microsoft提供的ODBC驱动程序替换它。Microsoft在提供MS SQL for Linux的同时,还提供了这种Linux驱动程序 如果您使用的是FreeTDS,您可以通过更改本答案中提到的协议版本号来获得一些里程
从错误消息中可以看出,您的Sybase Perl DBD驱动程序是使用“DBLib”编译的,而“DBLib”实际上已经多年没有维护过了。20世纪90年代,它被CTLib取代。DBLib不支持多字节字符集 您可能希望升级/重新编译DBD驱动程序,或者用Microsoft提供的ODBC驱动程序替换它。Microsoft在提供MS SQL for Linux的同时,还提供了这种Linux驱动程序 如果您使用的是FreeTDS,您可以通过更改本答案中提到的协议版本号来获得一些里程