【发布时间】:2013-12-16 16:24:29
【问题描述】:
我的sql语句如下:
if not exists (select col_a from t_a where co_b = 'v_b')
begin
insert into t_a (col_a ,col_b )
VALUES(v_a,v_b)
end
else
begin
update t_a set col_a = v_a, col_b = v_b where col_b = 'v_b'
end
由于我有数百行要更新,我怎样才能在 Perl 中以最少的时间成本进行更新?
如果我使用 Prepare + Execute,如何使用占位符 ? 编写语句?
$dbh->prepare($statement); 是否支持像上面那样的多个复合 SQL 行?还是我必须将这些行保存到一个 sql 文件中并使用 SQL server 运行它?
为了让问题更清楚,我的 Perl 行如下所示:
$statement = "if ... VALUES(?,?)...update t_a set col_a = ?, col_b = ?";
# better to use one binding values(v_a, v_b) couplets mapping
# the 2 placeholders of insert and update both?
foreach (@$va_arr) {
my $values_for_one_row = $_;
$dbh->prepare($statement);
$execute->execute($values_for_one_row->{col_a }, $values_for_one_row->{col_b });
}
我忘了一件事:'whatever' 也是 $va_arr 中的一个值,每次迭代都会更改:如果不存在(从 t_a 中选择 col_a,其中 co_b = 'v_b')。此外,更新部分应该是: update t_a set col_a = ?, col_b = ?其中 col_b = "v_b"。似乎没有更好的方法然后将准备包含到循环中?抱歉,我认为示例不完整。不过我觉得simbabque的回答已经够好了。
【问题讨论】:
-
DBI 支持每次调用
execute运行单个 SQL 语句。这对我来说似乎是一个单一的陈述。您应该阅读documentation of DBI。 -
对不起,我没听清楚你的话。我的语句有一些由 SQL 服务器引擎更好地处理的 if-else 逻辑。我没想到将逻辑包含在 Perl 行中。我听说准备很昂贵,因为我每次调用 @$va_arr 循环都有数百行。
-
你说得对。请在下面查看我的答案。
-
什么版本的 SQL Server?你能"upsert" via MERGE吗?
标签: sql sql-server perl