【发布时间】:2010-02-16 12:11:14
【问题描述】:
我必须管理一个日志,我必须在其中查看事务插入的行数。有没有办法动态地做到这一点?
【问题讨论】:
标签: sql-server sql-server-2005
我必须管理一个日志,我必须在其中查看事务插入的行数。有没有办法动态地做到这一点?
【问题讨论】:
标签: sql-server sql-server-2005
@@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 等,您需要确定您希望如何“计算”正在发生的事情。您可以为每个表设置单独的总计、单个总计值或完全不同的值。您需要为要跟踪的每个总数声明一个变量,并在适用于它的每个操作之后添加到它:
--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
【讨论】:
SELECT @Rows=@@ROWCOUNT,而是尝试了SET @Rows=@@ROWCOUNT,但仍然收到相同的结果。谢谢你,好帖子!
SELECT,您可以在单个语句中进行多个分配,因此您可以轻松添加SELECT @Rows=@@ROWCOUNT, @ID=SCOPE_IDENTITY(), @Error=@@ERROR。 SET 只能设置一个值。 TRY CATCH 消除了捕获@@ERROR 的需要,但我仍然使用SELECT。
@@ROWCOUNT,因为它是在每个命令之后设置的,甚至是COMMIT,甚至是您的SET @Rows=@@ROWCOUNT。例如,如果您更新 4 行然后提交,您的 @@ROWCOUNT 将在 UPDATE 之后为 4,但在 COMMIT 之后将为零。这就是在局部变量中捕获@@ROWCOUNT 的原因。
0 用于 rows 和 1 用于 rowcount。我不确定是否有哪里出错了
如果您需要有关日志/审核的更多信息,您可以使用 OUTPUT 子句: 这样,您不仅可以保留受影响的行数,还可以保留哪些记录。
作为插入期间输出子句的示例: SQL Server list of insert identities
DECLARE @InsertedIDs table(ID int);
INSERT INTO YourTable
OUTPUT INSERTED.ID
INTO @InsertedIDs
SELECT ...
HTH
【讨论】:
我找到了之前帖子的答案。在这里。
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
【讨论】:
【讨论】: