我必須管理一個日誌,我必須查看事務插入的行數。有沒有辦法動態地做到這一點?如何獲取事務插入的行數
35
A
回答
77
@@ ROWCOUNT將給出受上一條 SQL語句影響的行數,最好將它捕獲到有問題的命令後面的局部變量中,因爲下次查看它時它的值會發生變化:
DECLARE @Rows int
DECLARE @TestTable table (col1 int, col2 int)
INSERT INTO @TestTable (col1, col2) select 1,2 union select 3,4
SELECT @[email protected]@ROWCOUNT
SELECT @Rows AS Rows,@@ROWCOUNT AS [ROWCOUNT]
OUTPUT:
(2 row(s) affected)
Rows ROWCOUNT
----------- -----------
2 1
(1 row(s) affected)
你的Rows
值2,插入的行數,但ROWCOUNT是1,因爲SELECT @[email protected]@ROWCOUNT
命令影響的1行
如果在事務中有多個INSERT或UPDATE等,則需要確定如何「計數」發生了什麼。您可以爲每個表格單獨總計,單個總計值或完全不同的東西。你需要爲每個總要跟蹤並添加到它適用於它的每個操作之後的聲明一個變量:
--note there is no error handling here, as this is a simple example
DECLARE @AppleTotal int
DECLARE @PeachTotal int
SELECT @AppleTotal=0,@PeachTotal=0
BEGIN TRANSACTION
INSERT INTO Apple (col1, col2) Select col1,col2 from xyz where ...
SET @[email protected][email protected]@ROWCOUNT
INSERT INTO Apple (col1, col2) Select col1,col2 from abc where ...
SET @[email protected][email protected]@ROWCOUNT
INSERT INTO Peach (col1, col2) Select col1,col2 from xyz where ...
SET @[email protected][email protected]@ROWCOUNT
INSERT INTO Peach (col1, col2) Select col1,col2 from abc where ...
SET @[email protected][email protected]@ROWCOUNT
COMMIT
SELECT @AppleTotal AS AppleTotal, @PeachTotal AS PeachTotal
2
如果你需要爲你的日誌/審計可以輸出條款進一步信息: 這樣,不僅保留了受影響的行數,還記錄了什麼。
作爲插入期間的輸出條款的例子: SQL Server list of insert identities
DECLARE @InsertedIDs table(ID int);
INSERT INTO YourTable
OUTPUT INSERTED.ID
INTO @InsertedIDs
SELECT ...
HTH
2
我找到答案至5月以前的職位。這裏是。
CREATE TABLE #TempTable (id int)
INSERT INTO @TestTable (col1, col2) OUTPUT INSERTED.id INTO #TempTable select 1,2
INSERT INTO @TestTable (col1, col2) OUTPUT INSERTED.id INTO #TempTable select 3,4
SELECT * FROM #TempTable --this select will chage @@ROWCOUNT value
相關問題
- 1. 如何獲取「插入忽略stament」中插入行的數量
- 2. 如何使用QSqlQuery獲取事務中以前插入的行的ID
- 3. 如何從JayData事務中獲取上次插入ID?
- 4. 如何獲取插入的表格行?
- 5. 如何獲取插入行的ID(新)
- 6. 如何鎖定事務以讀取行然後插入Hibernate?
- 7. WebSQL:插入多行/事務
- 8. 如何獲取最後插入的行在SQL服務器
- 9. MySQLi - 如何獲取行插入到表
- 10. 如何在oracle中插入,並獲取插入行的ID?
- 11. 如何獲取插入行ON插入的ID?
- 12. CloudTable.ExecuteQuery:如何獲取事務數
- 13. 插入事務和參數?
- 14. 獲取插入的行
- 15. 獲取插入行的PID
- 16. 如何獲取數據插入表
- 17. 如何獲取不同的行最後插入到數據庫?
- 18. 如何從wordpress數據庫獲取最後插入的行ID?
- 19. MySQL的:事務安全插入時行
- 20. 獲取爲ON DUPLICATE KEY UPDATE多插入插入的行數?
- 21. linq插入:獲取行號
- 22. SQL獲取插入行的行號
- 23. 如何從C觸發器中插入行中獲取數據?
- 24. 如何獲取插入行的ID和更新行?
- 25. 在事務內插入後獲取id(Oracle)
- 26. 在事務中獲取所有插入標識
- 27. Mysql插入行忽略當前事務
- 28. 如何獲取插入記錄的ID?
- 29. 如何獲取最後插入的ID?
- 30. Simplepie,如何獲取插入的url feed
不是使用'SELECT @Rows = @@ ROWCOUNT',我嘗試了'SET @Rows = @@ ROWCOUNT'並仍然收到相同的結果。謝謝你,好帖子! – MikeTeeVee
僅供參考:_Even_在事務塊語句中封裝了INSERT語句,導致@@ RowCount被重置,因此我必須在調用Commit之前設置@Rows變量! – MikeTeeVee
@MikeTeeVee通過使用'SELECT',您可以在單個語句中進行多個賦值,因此您可以輕鬆添加'SELECT @Rows = @@ ROWCOUNT,@ID = SCOPE_IDENTITY(),@Error = @@ ERROR'。使用'SET'你只能設置一個值。 'TRY CATCH'不需要捕捉'@@ ERROR',但我仍然使用'SELECT'。 –