SQL Server的精度无效存在检查查询

问题描述:

在下面的Perl脚本使用SQL Server 2008我得到的和无效的精度值误差:SQL Server的精度无效存在检查查询

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

tbl中idx的数据类型是什么? – 2010-08-11 17:05:26

+0

你能显示错误吗? – Axeman 2010-08-11 17:56:51

+0

idx是一个varchar。错误的确切文本是 [Microsoft] [ODBC SQL Server驱动程序] [无效的精度值(SQL-HY104)在filename.pl ... – 2010-08-11 18:12:44

基于this article,请尝试以下方法:

你需要从DBI 导入SQL类型常量并指定SQL_LONGVARCHAR作为数据的类型要添加到备注字段。

为了做到这一点,你做的事:

$ dbh-> bind_param(1,$ IDX,SQL_LONGVARCHAR);

+0

请注意,如果您的idx列超过255个字符,我会100%确定。如果不是,它可能会起作用,但我不确定,因为255字符限制通常首先导致这样的错误。 – DVK 2010-08-11 19:50:20

+0

事实证明,它是一个varchar(9),但如果我使用SQL_VARCHAR,那么这确实有效。任何想法为什么它虽然工作? 感谢您的帮助。 – 2010-08-11 20:46:35

+0

@Chuck - 我目前唯一的智能想法是有一个“int”类似的值...如果该值是一个非数字字符串,原始代码barf会不会? – DVK 2010-08-11 20:49:10

使用特定类型的绑定将覆盖DBD :: ODBC决定的内容。 DBD :: ODBC将根据从SQLDescribeParam返回的内容绑定参数。有时SQL Server的SQLDescribeParam失败,尤其是在使用函数或子查询的情况下。 SQL Server ODBC驱动程序接受您的SQL并重新排列它以尝试最终得到类似于“从tbl中选择idx”之类的内容,然后查看要回答SQLDescribeParam调用的列。我打赌SQL Server ODBC驱动程序无法在这种情况下重新安排您的SQL,并且SQLDescribeParam失败或返回错误的信息。如果您在DBD :: ODBC中启用跟踪,我们可能会看到发生这种情况。