Недопустимая точность сервера sql для запроса проверки существует - PullRequest
0 голосов
/ 11 августа 2010

При использовании 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 ]

3 голосов
/ 11 августа 2010

На основании этой статьи , попробуйте следующее:

Вам необходимо импортировать константы типа SQL из DBI. и укажите этот SQL_LONGVARCHAR в качестве типа данных, которые будут добавлены в памятное поле.

Для этого вы делаете:

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

1 голос
/ 12 августа 2010

Связывание с определенным типом отменяет решение DBD :: ODBC. DBD :: ODBC будет связывать параметр на основе того, что возвращается из SQLDescribeParam. Иногда SQLDescribeParam в SQL Server дает сбой, особенно в тех случаях, когда вы используете функции или подвыборы. Драйвер ODBC для SQL Server берет ваш SQL и реорганизует его, чтобы попытаться получить что-то вроде «select idx from tbl», а затем просматривает столбцы для ответа на вызовы SQLDescribeParam. Я держу пари, что в этом случае драйвер ODBC для SQL Server не может переставить ваш SQL, и либо SQLDescribeParam завершился ошибкой, либо вернул неверную информацию. Если вы включите трассировку в DBD :: ODBC, мы, вероятно, увидим это.

...