我用perl DBI做()將執行以下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僅包含受第一個更新語句影響的行。所以我沒有關於刪除行的任何信息,但是我可以看到行確實在數據庫中被刪除。
一般來說,如果我在BEGIN TRAN,COMMIT TRAN塊內有INSERT,DELETE,UPDATE語句,並且如果整個塊將由DBI do()方法提交,我需要知道插入的語句的確切數目,更新的報表數量和刪除的報表數量。
我知道SQL SERVER的@@ ROWCOUNT會給我在每個語句後受到影響的行,但這是一個SQL服務器變量,它只會在塊內部可見。是否有可能獲得數據到Perl?
任何幫助?
我有一大堆的INSERT, DELETE,UPDATE作爲單個事務運行。即爲什麼我需要在T-SQL BEGIN TRAN和COMMIT TRAN塊中包含所有語句。所以我能想到的唯一方法是將整個SQL作爲一個字符串,準備()它,執行並獲取返回的結果,這將有計數。如果在begin_work內部有多個do,並且按照您的寫法提交,則會產生相同的效果。完全是ACID嗎? – 2010-11-18 03:22:36
是的,在begin_work和rollback/commit之間使用多個do語句與T-SQL中的BEGIN TRANSACTION和ROLLBACK TRANSACTION/COMMIT TRANSACTION塊具有相同的效果。您可以通過用$ dbh - > {AutoCommit} = 0 ;,替換$ dbh-> begin_work來測試此行爲,然後在不同的DML操作之後添加提交和回滾。無論事務是回滾還是已提交,打印都將顯示受影響的行數,但轉儲表結果應顯示預期數據。 – Bryan 2010-11-18 17:32:15