HI,
我使用perl DBI do(),它将执行下面的SQL块,如下所示,它在SQL SERVER 2005中执行
eval { my $result = do(<<SQL); BEGIN TRAN UPDATE table1 SET col1 = 999 where date = '2010-08-27' DELETE FROM table1 where date = '2010-08-30' COMMIT TRAN SQL $logger->info($result); };
现在我可以看到返回值$ result只包含受第一个更新语句影响的行。所以我没有关于已删除行的任何信息,但我可以看到这些行确实已在数据库中删除。 / p>
一般情况下,如果我在BEGIN TRAN,COMMIT TRAN块中有一个INSERT,DELETE,UPDATE语句,如果整个块将由DBI do()方法提交,我需要知道插入的语句的确切数量,更新的语句数和删除的语句数。
我知道SQL SERVER的@@ ROWCOUNT会在每个语句之后给出受影响的行,但这是一个SQL服务器变量,它只在块内可见。是否可以将数据导入perl?
任何帮助?
答案 0 :(得分:2)
要获取@@ROWCOUNT
的值,需要在“COMMIT TRAN”之前添加SELECT @@ROWCOUNT 'rowcount'
作为最后一个命令,然后整个SQL将返回1行与1行数的结果集'专栏。
唯一需要注意的是,由于do()
方法无法为您提供结果集,因此您需要切换到prepare()/fetchrow_array()/fetchrow_array()
,或者使用其中一种包装方法,例如nsql()
你的数据库库是否可用。
对于详细的插入/更新/删除细分,只需在插入/更新/删除后将那些@@ ROWCOUNTs保存到变量中,然后选择计数:
declare @update_count int
declare @delete_count int
UPDATE table1 SET
col1 = 999 where date = '2010-08-27'
SELECT @update_count = @@ROWCOUNT
DELETE FROM table1
where date = '2010-08-30'
SELECT @delete_count = @@ROWCOUNT
SELECT @update_count 'update_count', @delete_count '@delete_count'
答案 1 :(得分:1)
正在使用哪种数据库访问方法?是否有任何理由不将事务逻辑移到T-SQL之外?
如果您正在使用DBI,这些内容应符合您的要求:
eval {
$dbh->begin_work;
$dbh->do("CREATE TABLE #temp (col1 INTEGER, date DATETIME);");
# Inserts
my $inserted = $dbh->do("INSERT INTO #temp VALUES (1,'2010-08-27');");
$inserted += $dbh->do("INSERT INTO #temp SELECT 999,'2010-08-27' UNION SELECT 5, '2010-08-30';");
# Updates
my $updated = $dbh->do("UPDATE #temp SET col1 = 999 WHERE date = '2010-08-27';");
# Deleted
my $deleted = $dbh->do("DELETE FROM #temp WHERE date = '2010-08-30';");
$dbh->commit;
print "Inserted $inserted rows.\n";
print "Updated $updated rows.\n";
print "Deleted $deleted rows.\n"; }
此代码段不考虑建立数据库连接,错误处理或关闭连接,但DBI文档应该有帮助。 http://metacpan.org/pod/DBI
如果您计划执行多个非选择语句,您可能还需要查看prepare和bind_param DBI方法。