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;
然后它工作。我真的很困惑如何?在查询中可能会导致无效的精度错误。
感谢任何人都可以提供的帮助。
答
基于this article,请尝试以下方法:
你需要从DBI 导入SQL类型常量并指定SQL_LONGVARCHAR作为数据的类型要添加到备注字段。
为了做到这一点,你做的事:
$ dbh-> bind_param(1,$ IDX,SQL_LONGVARCHAR);
答
使用特定类型的绑定将覆盖DBD :: ODBC决定的内容。 DBD :: ODBC将根据从SQLDescribeParam返回的内容绑定参数。有时SQL Server的SQLDescribeParam失败,尤其是在使用函数或子查询的情况下。 SQL Server ODBC驱动程序接受您的SQL并重新排列它以尝试最终得到类似于“从tbl中选择idx”之类的内容,然后查看要回答SQLDescribeParam调用的列。我打赌SQL Server ODBC驱动程序无法在这种情况下重新安排您的SQL,并且SQLDescribeParam失败或返回错误的信息。如果您在DBD :: ODBC中启用跟踪,我们可能会看到发生这种情况。
tbl中idx的数据类型是什么? – 2010-08-11 17:05:26
你能显示错误吗? – Axeman 2010-08-11 17:56:51
idx是一个varchar。错误的确切文本是 [Microsoft] [ODBC SQL Server驱动程序] [无效的精度值(SQL-HY104)在filename.pl ... – 2010-08-11 18:12:44