使用sql server 2008我在以下perl脚本中得到了无效的精度值错误:
use DBI;
$idx = '12345';
$query = 'if exists (select * from tbl where idx = ?) select top 10 * from tbl';
my $h = $dbh->prepare($query) or die "Couldn't prepare query: " . $dbh->errstr;
$h->execute($idx) or die "Couldn't execute statement: " . $h->errstr;
但请注意,如果我尝试这样做
use DBI;
$query = 'if exists (select * from tbl where idx = \'12345\') select top 10 * from tbl';
my $h = $dbh->prepare($query) or die "Couldn't prepare query: " . $dbh->errstr;
$h->execute() or die "Couldn't execute statement: " . $h->errstr;
然后它的工作原理。我真的很困惑怎么了?在查询中可能导致无效的精度错误。
感谢任何人提供的任何帮助。
答案 0 :(得分:3)
根据this article,请尝试以下操作:
您需要从DBI导入SQL类型常量 并指定SQL_LONGVARCHAR作为要添加到备注字段的数据类型。
要做到这一点:
$ dbh-> bind_param(1,$ idx,SQL_LONGVARCHAR);
答案 1 :(得分:1)
使用特定类型绑定会覆盖DBD :: ODBC所决定的内容。 DBD :: ODBC将根据SQLDescribeParam返回的内容绑定参数。有时,SQL Server的SQLDescribeParam会失败,尤其是在使用函数或子选择的情况下。 SQL Server ODBC驱动程序接受您的SQL并重新排列它以尝试最终得到类似“从tbl中选择idx”的内容,然后查看列以回答SQLDescribeParam调用。我打赌SQL Server ODBC驱动程序在这种情况下无法重新排列SQL,并且SQLDescribeParam失败或返回错误的信息。如果在DBD :: ODBC中启用跟踪,我们可能会发现这种情况。