sql server存在检查查询无效精度

时间:2010-08-11 17:03:18

标签: sql-server perl sql-server-2008 dbi

使用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;

然后它的工作原理。我真的很困惑怎么了?在查询中可能导致无效的精度错误。

感谢任何人提供的任何帮助。

2 个答案:

答案 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中启用跟踪,我们可能会发现这种情况。