如何在perl bind_param()中转义本机SQL函数?

时间:2010-01-15 01:11:10

标签: sql-server perl

所以我有以下代码段:

my $sql = "INSERT INTO mytbl (first_name, last_name, birthdate) VALUES (?, ?, ?)";
my $sth = $dbh->prepare($sql) or die "Error:".$dbh->errstr;                 

$sth->bind_param(1, $fname);
$sth->bind_param(2, $lname);
$sth->bind_param(3, $bdate);
$sth->execute() or die "Execution failed: " . $dbh->errstr;
$sth->finish();

使用以下生日日期数据在Microsoft SQL中执行插入时, $ bdate =“2010-01-06”;我必须使用SQL将其转换为日期时间函数,

$bdate = "cast ('$eml_form_end_dt' as datetime)";

然而,这导致了问题,因为perl无法识别它。我必须做的是:

$bdate = "cast ('$eml_form_end_dt' as datetime)";
my $sql = "INSERT INTO mytbl (first_name, last_name, birthdate VALUES (?, ?, '$bdate')";
my $sth = $dbh->prepare($sql) or die "Error:".$dbh->errstr;                 

$sth->bind_param(1, $fname);
$sth->bind_param(2, $lname);
# This causes problem
# $sth->bind_param(3, "cast ('$eml_form_end_dt' as datetime)");
$sth->execute() or die "Execution failed: " . $dbh->errstr;
$sth->finish();

在这种情况下如何转义SQL函数?

编辑:这是我收到的错误消息: DBD :: ODBC :: st执行失败:[Microsoft] [ODBC SQL Server驱动程序]无效的精度 在filename.pl。上的值(SQL-HY104)。

4 个答案:

答案 0 :(得分:2)

问题是绑定参数只允许传递值,而不是任意SQL表达式。这非常依赖于设计,因为另一种方式将消除绑定变量的主要好处:缓存编译语句和防止SQL注入攻击。所以函数必须进入你的SQL:

my $sql = "INSERT INTO mytbl (first_name, last_name, birthdate VALUES (?, ?, cast(? as datetime))";
my $sth = $dbh->prepare($sql) or die "Error:".$dbh->errstr;                 

$sth->bind_param(1, $fname);
$sth->bind_param(2, $lname);
$sth->bind_param(3, $eml_form_end_dt);
$sth->execute() or die "Execution failed: " . $dbh->errstr;
$sth->finish();

那应该有用。

答案 1 :(得分:0)

我认为你真正想要的是

use DBI qw(:sql_types);
...
$sth->bind_param(3, $bdate, SQL_DATETIME);

告诉DBI要使用的正确类型(默认为varchar)。您可能需要使用SQL_DATE代替SQL_DATETIME;我自己不使用SQL Server。

答案 2 :(得分:0)

我很确定MS SQL会将字符串转换为没有任何强制转换的日期。您是否在将“2010-01-06”绑定到占位符时遇到问题?如果这不起作用,那么你可以使用bind_param的第三个参数来告诉参数的类型。或者你可以试试:

my $sql = "INSERT INTO mytbl (first_name, last_name, birthdate) VALUES (?, ?, cast(? as datetime))";

并将日期的字符串版本绑定到该占位符。

更新:令人惊讶的是有多少人(包括我)错过了失踪的权利。

答案 3 :(得分:0)

不应该这样:

INSERT INTO mytbl (first_name, last_name, birthdate VALUES (?, ?, cast(? as datetime))

是这样的:

INSERT INTO mytbl (first_name, last_name, birthdate) VALUES (?, ?, cast(? as datetime))