HI,
我使用perl DBI do(),它将执行下面的SQL块,如下所示,它在SQL SERVER 2005中执行
eval {
my $ result = do(<< SQL);
开始了
UPDATE table1 SET
col1 = 999其中date ='2010-08-27'
从table1中删除
where date ='2010-08-30'
COMMIT TRAN
SQL
$ logger->信息($结果);
};
现在我可以看到返回值$ result只包含受第一个更新语句影响的行 . 所以我没有关于已删除行的任何信息,但我可以看到在数据库中确实删除了行 .
一般来说,如果我在BEGIN TRAN,COMMIT TRAN块中有一个INSERT,DELETE,UPDATE语句,如果整个块将由DBI do()方法提交,我需要知道插入的语句的确切数量,语句数量更新和删除的语句数 .
我知道SQL SERVER的@@ ROWCOUNT会在每个语句之后给出受影响的行,但这是一个SQL服务器变量,它只在块内可见 . 是否有可能将数据转换为perl?
有帮助吗?
2 回答
要获取
@@ROWCOUNT
的值,需要在"COMMIT TRAN"之前添加SELECT @@ROWCOUNT 'rowcount'
作为最后一个命令,然后整个SQL将返回1行的结果集,其中包含1 'rowcount'列 .唯一需要注意的是,由于
do()
方法不能为您提供结果集,因此您需要切换到prepare()/fetchrow_array()/fetchrow_array()
,或者如果可用,请使用数据库中的nsql()
之类的包装器方法 .对于详细的插入/更新/删除细分,只需在插入/更新/删除后将那些@@ ROWCOUNTs保存到变量中,然后选择计数:
正在使用什么数据库访问方法?是否有任何理由不将事务逻辑移到T-SQL之外?
如果您正在使用DBI,那么这些内容应满足您的要求:
此代码段不考虑数据库连接,错误处理或关闭连接,但DBI文档应该有帮助 . http://metacpan.org/pod/DBI
如果您计划执行多个非select语句,您可能还需要查看prepare和bind_param DBI方法 .