2010-08-11 116 views
0

在下面的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

回答

3

基於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

1

使用特定類型的綁定將覆蓋DBD :: ODBC決定的內容。 DBD :: ODBC將根據從SQLDescribeParam返回的內容綁定參數。有時SQL Server的SQLDescribeParam失敗,尤其是在使用函數或子查詢的情況下。 SQL Server ODBC驅動程序接受您的SQL並重新排列它以嘗試最終得到類似於「從tbl中選擇idx」之類的內容,然後查看要回答SQLDescribeParam調用的列。我打賭SQL Server ODBC驅動程序無法在這種情況下重新安排您的SQL,並且SQLDescribeParam失敗或返回錯誤的信息。如果您在DBD :: ODBC中啓用跟蹤,我們可能會看到發生這種情況。