我必须管理一个日志,我必须看到事务插入的行数。有没有办法动态地做到这一点?
答案 0 :(得分:92)
@@ ROWCOUNT将给出受 last SQL语句影响的行数,最好按照相关命令将其捕获到局部变量中,因为它的值将在下次更改你看看它:
DECLARE @Rows int
DECLARE @TestTable table (col1 int, col2 int)
INSERT INTO @TestTable (col1, col2) select 1,2 union select 3,4
SELECT @Rows=@@ROWCOUNT
SELECT @Rows AS Rows,@@ROWCOUNT AS [ROWCOUNT]
输出:
(2 row(s) affected)
Rows ROWCOUNT
----------- -----------
2 1
(1 row(s) affected)
您的Rows
值为2,即插入的行数,但ROWCOUNT为1,因为SELECT @Rows=@@ROWCOUNT
命令影响了1行
如果您的交易中有多个INSERT或UPDATE等,您需要确定如何“计算”正在发生的事情。每张表可以有一个单独的总计,一个总的总价值,或者完全不同的东西。您需要为每个要跟踪的总数DECLARE变量,并在每个适用于它的操作后添加到该变量:
--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 @AppleTotal=@AppleTotal+@@ROWCOUNT
INSERT INTO Apple (col1, col2) Select col1,col2 from abc where ...
SET @AppleTotal=@AppleTotal+@@ROWCOUNT
INSERT INTO Peach (col1, col2) Select col1,col2 from xyz where ...
SET @PeachTotal=@PeachTotal+@@ROWCOUNT
INSERT INTO Peach (col1, col2) Select col1,col2 from abc where ...
SET @PeachTotal=@PeachTotal+@@ROWCOUNT
COMMIT
SELECT @AppleTotal AS AppleTotal, @PeachTotal AS PeachTotal
答案 1 :(得分:5)
如果您需要有关日志/审核的更多信息,可以使用OUTPUT子句: 这样,您不仅可以保持受影响的行数,还可以记录哪些记录。
作为插入期间输出子句的示例: SQL Server list of insert identities
DECLARE @InsertedIDs table(ID int);
INSERT INTO YourTable
OUTPUT INSERTED.ID
INTO @InsertedIDs
SELECT ...
HTH
答案 2 :(得分:2)
我找到了上一篇文章的答案。在这里。
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
答案 3 :(得分:-1)