所以我有以下代码段:
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)。
答案 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))